]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add error checking: Do not allow functions other than those in the
authordrh <>
Sat, 31 Aug 2024 22:22:24 +0000 (22:22 +0000)
committerdrh <>
Sat, 31 Aug 2024 22:22:24 +0000 (22:22 +0000)
percentile extension to use the ordered-set aggregate notation.

FossilOrigin-Name: 317d901429303340290334dbe7680a36339df0a50b586e3f71b6c5e5eba6d411

ext/misc/percentile.c
manifest
manifest.uuid
src/main.c
src/parse.y
src/resolve.c
src/sqlite.h.in
src/sqliteInt.h

index 3e619db69e8acd43092d0d44c5d72c2dc2c9e978..ead3f61276db5f21c2cca1431eede9bcf1851b20 100644 (file)
@@ -436,14 +436,12 @@ int sqlite3_percentile_init(
 #endif
   (void)pzErrMsg;  /* Unused parameter */
   rc = sqlite3_create_window_function(db, "percentile", 2, 
-                                 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
-                                 percentStep, percentFinal,
-                                 percentValue, percentInverse, 0);
+          SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_SELFORDER1, 0,
+          percentStep, percentFinal, percentValue, percentInverse, 0);
   if( rc==SQLITE_OK ){
     rc = sqlite3_create_window_function(db, "median", 1, 
-                                 SQLITE_UTF8|SQLITE_INNOCUOUS, 0,
-                                 percentStep, percentFinal,
-                                 percentValue, percentInverse, 0);
+          SQLITE_UTF8|SQLITE_INNOCUOUS|SQLITE_SELFORDER1, 0,
+          percentStep, percentFinal, percentValue, percentInverse, 0);
   }
   return rc;
 }
index 8e2ff1cd430eb905bd94db774231afe6bd364a3f..34c44301862370d924870e3f1b079d16cde745f5 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Demonstration\sof\show\sordered-set\saggregates\smight\sbe\sparsed\sand\sintegrated\ninto\sthe\sexisting\sparse\stree,\sshould\swe\sdecide\sto\ssupport\sthem.
-D 2024-08-31T20:09:37.704
+C Add\serror\schecking:\sDo\snot\sallow\sfunctions\sother\sthan\sthose\sin\sthe\npercentile\sextension\sto\suse\sthe\sordered-set\saggregate\snotation.
+D 2024-08-31T22:22:24.013
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -410,7 +410,7 @@ F ext/misc/nextchar.c 7877914c2a80c2f181dd04c3dbef550dfb54c93495dc03da2403b5dd58
 F ext/misc/noop.c f1a21cc9b7a4e667e5c8458d80ba680b8bd4315a003f256006046879f679c5a0
 F ext/misc/normalize.c bd84355c118e297522aba74de34a4fd286fc775524e0499b14473918d09ea61f
 F ext/misc/pcachetrace.c f4227ce03fb16aa8d6f321b72dd051097419d7a028a9853af048bee7645cb405
-F ext/misc/percentile.c ea1ff3561374c520193d5c3b3c86a40d922a9f0c2b48ae784d6cd9490093bd9d
+F ext/misc/percentile.c 487b44e4f90674b1006e7309f22d37f4dedfa251b1f6e3e803dae56ceced14ee
 F ext/misc/prefixes.c 82645f79229877afab08c8b08ca1e7fa31921280906b90a61c294e4f540cd2a6
 F ext/misc/qpvtab.c fc189e127f68f791af90a487f4460ec91539a716daf45a0c357e963fd47cc06c
 F ext/misc/randomjson.c ef835fc64289e76ac4873b85fe12f9463a036168d7683cf2b773e36e6262c4ed
@@ -728,7 +728,7 @@ F src/insert.c f8d1a0f8ee258411009c6b7f2d93170e351bd19f5ad89d57e1180644297cbe70
 F src/json.c 5b6a1d6015997b9ee848a32948720bdb26a0ef2de5a2127ebf7355ce66dbdc0d
 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
 F src/loadext.c 7432c944ff197046d67a1207790a1b13eec4548c85a9457eb0896bb3641dfb36
-F src/main.c a520c325c7400b249242945f2c602acb19662c40f5db1c04d88664cfaa8b85ac
+F src/main.c e7b53893f9fb3ad76baa8513f85c167b34d5c8e25ce64608db440f5637d0fe9e
 F src/malloc.c 410e570b30c26cc36e3372577df50f7a96ee3eed5b2b161c6b6b48773c650c5e
 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645
 F src/mem1.c 3bb59158c38e05f6270e761a9f435bf19827a264c13d1631c58b84bdc96d73b2
@@ -754,7 +754,7 @@ F src/os_win.c 6ff43bac175bd9ed79e7c0f96840b139f2f51d01689a638fd05128becf94908a
 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
 F src/pager.c b08600ebf0db90b6d1e9b8b6577c6fa3877cbe1a100bd0b2899e4c6e9adad4b3
 F src/pager.h 4b1140d691860de0be1347474c51fee07d5420bd7f802d38cbab8ea4ab9f538a
-F src/parse.y 32969201e800aa9d8238a532f66ea1c6863c16a480f540cafec7e6c352c73e52
+F src/parse.y 93b0f932dbae742fa8e1fd4fd74f8ca9330b396e0a108664010954311dd9a4ea
 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484
 F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5
 F src/pcache1.c 49516ad7718a3626f28f710fa7448ef1fce3c07fd169acbb4817341950264319
@@ -763,14 +763,14 @@ F src/pragma.h e690a356c18e98414d2e870ea791c1be1545a714ba623719deb63f7f226d8bb7
 F src/prepare.c d99931f45416652895e502328ca49fe782cfc4e1ebdcda13b3736d991ebf42ce
 F src/printf.c 6a87534ebfb9e5346011191b1f3a7ebc457f5938c7e4feeea478ecf53f6a41b2
 F src/random.c 606b00941a1d7dd09c381d3279a058d771f406c5213c9932bbd93d5587be4b9c
-F src/resolve.c 2c127880c0634962837f16f2f48a295e514357af959330cc038de73015d5b5e8
+F src/resolve.c b7e50d31c5dd15dd129b30943212a77d24ee62058d6c60cfc6ed5de9570f2063
 F src/rowset.c 8432130e6c344b3401a8874c3cb49fefe6873fec593294de077afea2dce5ec97
 F src/select.c 4b14337a2742f0c0beeba490e9a05507e9b4b12184b9cd12773501d08d48e3fe
 F src/shell.c.in 40de636c1d90fb8a9ca7f49dc8f50d930f1b60736e73aca5eb37c4c7d0e47f9d
-F src/sqlite.h.in f07bff4225a1244efd604a0ffef81ed69f29d3dbaed7e22f906f26229ba3ca9e
+F src/sqlite.h.in 4929a538ee660b23d774dd691f444f91b4aff2c05d6e98acce607ee7ae93e833
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 3f046c04ea3595d6bfda99b781926b17e672fd6d27da2ba6d8d8fc39981dcb54
-F src/sqliteInt.h 8eac0c901803fc1fca0faa0ad28492c3b5f38c436d2f594c03308d9b955dbecb
+F src/sqliteInt.h aa6ed92b72969d97def6c346dfc6b5194276f44f43c332184e7d8861a7abb0d0
 F src/sqliteLimit.h 6878ab64bdeb8c24a1d762d45635e34b96da21132179023338c93f820eee6728
 F src/status.c cb11f8589a6912af2da3bb1ec509a94dd8ef27df4d4c1a97e0bcf2309ece972b
 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1
@@ -2211,11 +2211,8 @@ F vsixtest/vsixtest.tcl 6195aba1f12a5e10efc2b8c0009532167be5e301abe5b31385638080
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P d1d0942a947803d45a1fd9068f3518cf412178b6b9bafcb82db44c52d5820c11
-R d8caee9c6c8e089bfb48a8d01fa2ad93
-T *branch * ordered-set-agg
-T *sym-ordered-set-agg *
-T -sym-trunk *
+P ef9777890001ba0122d3add799795e118fd87243f42731ab84d4748b67605647
+R c9bceafb5aeb2174b63055fb2107e4ab
 U drh
-Z b43c798c432268071337348d4788bafe
+Z db0202ce7a6cda8a39ef6c63d39130ef
 # Remove this line to create a well-formed Fossil manifest.
index 2d0708c71b6b4d029c4565ea090375882919b5f9..81673bd4170e3b975a4de1ce3267459fb30f385a 100644 (file)
@@ -1 +1 @@
-ef9777890001ba0122d3add799795e118fd87243f42731ab84d4748b67605647
+317d901429303340290334dbe7680a36339df0a50b586e3f71b6c5e5eba6d411
index 5d6212208e93cacd3ac8e91d8ff55c062b9dfdbb..ac08eea04f4b1343f3ea4412f93ab29ccc453130 100644 (file)
@@ -1926,7 +1926,8 @@ int sqlite3CreateFunc(
   assert( SQLITE_FUNC_CONSTANT==SQLITE_DETERMINISTIC );
   assert( SQLITE_FUNC_DIRECT==SQLITE_DIRECTONLY );
   extraFlags = enc &  (SQLITE_DETERMINISTIC|SQLITE_DIRECTONLY|
-                       SQLITE_SUBTYPE|SQLITE_INNOCUOUS|SQLITE_RESULT_SUBTYPE);
+                       SQLITE_SUBTYPE|SQLITE_INNOCUOUS|
+                       SQLITE_RESULT_SUBTYPE|SQLITE_SELFORDER1);
   enc &= (SQLITE_FUNC_ENCMASK|SQLITE_ANY);
 
   /* The SQLITE_INNOCUOUS flag is the same bit as SQLITE_FUNC_UNSAFE.  But
index efcde10e64801b2cebf71ec810c09dca56526803..3db20e9acc429687d87527e0b5a8888bcb9c0673 100644 (file)
@@ -1204,7 +1204,7 @@ expr(A) ::= idj(X) LP STAR RP. {
                       pFuncname);
     }
     pExpr = sqlite3ExprFunction(pParse, p, pFuncname, 0);
-    if( pExpr ) pExpr->iTable = 1;
+    if( pExpr ) pExpr->iColumn = 1;
     return pExpr;
   }
 }
index b755cc86464dbdd1aaea8f9ed4da9dfe25451466..f448bc324a0a107836955909751518bdd83a5f61 100644 (file)
@@ -1292,6 +1292,10 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
       else if( ExprHasProperty(pExpr, EP_WinFunc) || pExpr->pLeft ){
         is_agg = 1;
       }
+      if( pExpr->iColumn && (pDef->funcFlags & SQLITE_SELFORDER1)==0 ){
+        sqlite3ErrorMsg(pParse, "%#T() is not a ordered-set aggregate function",
+                        pExpr);
+      }
       sqlite3WalkExprList(pWalker, pList);
       if( is_agg ){
         if( pExpr->pLeft ){
index 810ccecc96784726cb5ee48b1ead06efe467c135..8e5e327c93d81aac2c374dfb5c4842e83280d4a2 100644 (file)
@@ -5615,6 +5615,13 @@ int sqlite3_create_window_function(
 ** [sqlite3_result_subtype()] should avoid setting this property, as the
 ** purpose of this property is to disable certain optimizations that are
 ** incompatible with subtypes.
+**
+** [[SQLITE_SELFORDER1]] <dt>SQLITE_SELFORDER1</dt><dd>
+** The SQLITE_SELFORDER1 flag indicates that the function is an aggregate
+** that internally orders the values provided to the first argument.  The
+** ordered-set aggregate SQL notation can be used to invoke this function.
+** If the ordered-set aggregate notation is used on a function that lacks
+** this flag, then an error is raised.
 ** </dd>
 ** </dl>
 */
@@ -5623,6 +5630,7 @@ int sqlite3_create_window_function(
 #define SQLITE_SUBTYPE          0x000100000
 #define SQLITE_INNOCUOUS        0x000200000
 #define SQLITE_RESULT_SUBTYPE   0x001000000
+#define SQLITE_SELFORDER1       0x002000000
 
 /*
 ** CAPI3REF: Deprecated Functions
index dcadec78d7c7496e3d3424ba01fc4a275068e675..b77f035e7692f482843dbda171dabbe0679c0654 100644 (file)
@@ -3049,10 +3049,10 @@ struct Expr {
                          ** EP_Unlikely:  134217728 times likelihood
                          ** TK_IN: ephemeral table holding RHS
                          ** TK_SELECT_COLUMN: Number of columns on the LHS
-                         ** TK_SELECT: 1st register of result vector
-                         ** TK_FUNCTION: Uses ordered-set aggregate syntax */
+                         ** TK_SELECT: 1st register of result vector */
   ynVar iColumn;         /* TK_COLUMN: column index.  -1 for rowid.
                          ** TK_VARIABLE: variable number (always >= 1).
+                         ** TK_FUNCTION: Uses ordered-set aggregate syntax
                          ** TK_SELECT_COLUMN: column of the result vector */
   i16 iAgg;              /* Which entry in pAggInfo->aCol[] or ->aFunc[] */
   union {