]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix unreachable conditionals and revise a testcase that was made obsolete by
authordrh <drh@noemail.net>
Sat, 30 Sep 2017 01:25:04 +0000 (01:25 +0000)
committerdrh <drh@noemail.net>
Sat, 30 Sep 2017 01:25:04 +0000 (01:25 +0000)
the changes on this branch.

FossilOrigin-Name: 71f0adf7ca6824c3aba69104b9976dbb71b377474529e1a36220b4804293501e

manifest
manifest.uuid
src/expr.c
src/select.c
test/having.test

index 35a58bfa1972248ff00173847e99dae3c915986c..8d9fc53ff7d20ea8e244e9fa1b9ed685d0322e9b 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Always\srender\sa\ssubquery\sthat\sis\snot\spart\sof\sa\sjoin\sas\sa\sco-routine.
-D 2017-09-29T22:13:24.684
+C Fix\sunreachable\sconditionals\sand\srevise\sa\stestcase\sthat\swas\smade\sobsolete\sby\nthe\schanges\son\sthis\sbranch.
+D 2017-09-30T01:25:04.328
 F Makefile.in 4bc36d913c2e3e2d326d588d72f618ac9788b2fd4b7efda61102611a6495c3ff
 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
 F Makefile.msc 6033b51b6aea702ea059f6ab2d47b1d3cef648695f787247dd4fb395fe60673f
@@ -411,7 +411,7 @@ F src/ctime.c ff1be3eed7bdd75aaca61ca8dc848f7c9f850ef2fb9cb56f2734e922a098f9c0
 F src/date.c 48f743d88bbe88f848532d333cca84f26e52a4f217e86f86be7fc1b919c33d74
 F src/dbstat.c 7a4ba8518b6369ef3600c49cf9c918ad979acba610b2aebef1b656d649b96720
 F src/delete.c 21a5f1812fdb599e9f7afb9f650bdabab60a3afd51d7e94e539c982f647b0023
-F src/expr.c 628395aea8bbf4e2851565f9dab76565e3100ca0836a337fb748834c9cec9f04
+F src/expr.c 4d2d0aafd945424f638ee03e11330f03288ccf616e025498f3c8602d01609a0a
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 5ff2c895fe087756d8085dc1a9bc229b5670e2a65c3929dd87c71e43649af333
 F src/func.c b4d259af627e3cd9510cf08db37f0bcc88b1887c735169c74490c3739d5cf5c6
@@ -458,7 +458,7 @@ F src/printf.c 40aee47ae9be4bd3dbdc8968bd07fddc027be8edec8daddf24d3391d36698a1c
 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
 F src/resolve.c 4324a94573b1e29286f8121e4881db59eaedc014afeb274c8d3e07ed282e0e20
 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac
-F src/select.c 8e8e9965af11f7ca54a44fc2cea9e8d162a6ffa1ccd2e840c69ff4468e0d08e0
+F src/select.c 55a17d54eec9093baf4ccc25342e4b2168cb8198805ed08a44fd4ae389b34b19
 F src/shell.c c1206a23d9239f8f51751d3be9b8c3b02fa4103546bea1add7f864d84a8276ab
 F src/shell.c.in bb9720a8c5c98d3984b16ab7540e7142bcae959666ecf248bfc523a1d44220ee
 F src/sqlite.h.in ab4f8a29d1580dfaeb6891fa1b83cff8229ba0daa56994707ceaca71495d9ab7
@@ -911,7 +911,7 @@ F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14
 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536
 F test/gcfault.test dd28c228a38976d6336a3fc42d7e5f1ad060cb8c
 F test/genesis.tcl 1e2e2e8e5cc4058549a154ff1892fe5c9de19f98
-F test/having.test b3d6b17cc9601b6b373b2d0f08c075ccf30e2d307249c3c8a236e3c36907b1a5
+F test/having.test e4098a4b8962f9596035c3b87a8928a10648acc509f1bb8d6f96413bbf79a1b3
 F test/hexlit.test 4a6a5f46e3c65c4bf1fa06f5dd5a9507a5627751
 F test/hidden.test 23c1393a79e846d68fd902d72c85d5e5dcf98711
 F test/hook.test dbc0b87756e1e20e7497b56889c9e9cd2f8cc2b5
@@ -1655,7 +1655,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P f62cd4d940506c39db82e83ff3df8ab1856f1fb91ffda835ae2d727263ee9b0b
-R 5c67a1a4877d581279b4ed945a250449
+P 6b1651d711eae6e7c65a191f02ca2439160bcd677099712289e76a0f8422fd37
+R 3a66fd0c62efe88b91fd1bdc729b86a5
 U drh
-Z 6d48696ae0bb75b33e85df88734665c6
+Z 6d29940c14d977f820858db31a47d732
index 143260d74758509c68429439aaf37146f7fe2d71..2da525fc6b4daf5104f82283cfda2471e6bcfef6 100644 (file)
@@ -1 +1 @@
-6b1651d711eae6e7c65a191f02ca2439160bcd677099712289e76a0f8422fd37
\ No newline at end of file
+71f0adf7ca6824c3aba69104b9976dbb71b377474529e1a36220b4804293501e
\ No newline at end of file
index 8282c99a4abb522a80286d6a6948243a02098636..0b922cd0fdf4b64963fc97ddb075e1266a168425 100644 (file)
@@ -1712,12 +1712,11 @@ void sqlite3ExprListDelete(sqlite3 *db, ExprList *pList){
 u32 sqlite3ExprListFlags(const ExprList *pList){
   int i;
   u32 m = 0;
-  if( pList ){
-    for(i=0; i<pList->nExpr; i++){
-       Expr *pExpr = pList->a[i].pExpr;
-       assert( pExpr!=0 );
-       m |= pExpr->flags;
-    }
+  assert( pList!=0 );
+  for(i=0; i<pList->nExpr; i++){
+     Expr *pExpr = pList->a[i].pExpr;
+     assert( pExpr!=0 );
+     m |= pExpr->flags;
   }
   return m;
 }
index 0f46d73f3179af5bfac80d1d770f958c64fa6571..9c3544ae05e588a68dc8fdd2bd38a84c7481dc0e 100644 (file)
@@ -3401,7 +3401,8 @@ static void substSelect(
 **        parent to a compound query confuses the code that handles
 **        recursive queries in multiSelect().
 **
-**  (24)  The subquery may not be an aggregate that uses the built-in min() or 
+**  (**)  We no longer attempt to flatten aggregate subqueries.  Was:
+**        The subquery may not be an aggregate that uses the built-in min() or 
 **        or max() functions.  (Without this restriction, a query like:
 **        "SELECT x FROM (SELECT max(y), x FROM t1)" would not necessarily
 **        return the value X for which Y was maximal.)
@@ -3474,10 +3475,8 @@ static int flattenSubquery(
   if( pSub->pLimit && (p->selFlags & SF_Distinct)!=0 ){
      return 0;         /* Restriction (21) */
   }
-  testcase( pSub->selFlags & SF_Recursive );
-  testcase( pSub->selFlags & SF_MinMaxAgg );
-  if( pSub->selFlags & (SF_Recursive|SF_MinMaxAgg) ){
-    return 0; /* Restrictions (22) and (24) */
+  if( pSub->selFlags & (SF_Recursive) ){
+    return 0; /* Restrictions (22) */
   }
   if( (p->selFlags & SF_Recursive) && pSub->pPrior ){
     return 0; /* Restriction (23) */
@@ -3857,14 +3856,22 @@ static int pushDownWhereTerms(
 ){
   Expr *pNew;
   int nChng = 0;
-  Select *pX;           /* For looping over compound SELECTs in pSubq */
   if( pWhere==0 ) return 0;
-  for(pX=pSubq; pX; pX=pX->pPrior){
-    if( (pX->selFlags & (SF_Recursive))!=0 ){
-      testcase( pX!=pSubq );
-      return 0; /* restriction (2) */
+  if( pSubq->selFlags & SF_Recursive ) return 0;  /* restriction (2) */
+
+#ifdef SQLITE_DEBUG
+  /* Only the first term of a compound can have a WITH clause.  But make
+  ** sure no other terms are marked SF_Recursive in case something changes
+  ** in the future.
+  */
+  {
+    Select *pX;  
+    for(pX=pSubq; pX; pX=pX->pPrior){
+      assert( (pX->selFlags & (SF_Recursive))==0 );
     }
   }
+#endif
+
   if( pSubq->pLimit!=0 ){
     return 0; /* restriction (3) */
   }
index aea12319d7b934073dab29c68f7dc8f6a52bd6d1..a3882552d311785e9c1345833cd2b63fa6ade34a 100644 (file)
@@ -65,19 +65,6 @@ foreach {tn sql1 sql2} {
   3 "SELECT a, sum(b) FROM t1 GROUP BY a COLLATE binary HAVING a=2"
     "SELECT a, sum(b) FROM t1 WHERE a=2 GROUP BY a COLLATE binary"
 
-  4 {
-      SELECT x,y FROM (
-        SELECT a AS x, sum(b) AS y FROM t1 
-        GROUP BY a
-      ) WHERE x BETWEEN 8888 AND 9999
-    } {
-      SELECT x,y FROM (
-        SELECT a AS x, sum(b) AS y FROM t1 
-        WHERE x BETWEEN 8888 AND 9999 
-        GROUP BY a
-      )
-    }
-
   5 "SELECT a, sum(b) FROM t1 GROUP BY a COLLATE binary HAVING 0"
     "SELECT a, sum(b) FROM t1 WHERE 0 GROUP BY a COLLATE binary"
 
@@ -98,6 +85,24 @@ foreach {tn sql1 sql2} {
   do_compare_vdbe_test 2.$tn $sql1 $sql2 1
 }
 
+# The (4) test in the above set used to generate identical bytecode, but
+# that is no longer the case.  The byte code is equivalent, though.
+#
+do_execsql_test 2.4a {
+  SELECT x,y FROM (
+    SELECT a AS x, sum(b) AS y FROM t1 
+    GROUP BY a
+  ) WHERE x BETWEEN 2 AND 9999
+} {2 12}
+do_execsql_test 2.4b {
+  SELECT x,y FROM (
+    SELECT a AS x, sum(b) AS y FROM t1 
+    WHERE x BETWEEN 2 AND 9999 
+    GROUP BY a
+  )
+} {2 12}
+
+
 #-------------------------------------------------------------------------
 # 1: Test that the optimization is only applied if the GROUP BY term
 #    uses BINARY collation.