]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Fix a problem with views that use window functions as part of complex expressions.
authordrh <drh@noemail.net>
Mon, 24 Sep 2018 18:29:21 +0000 (18:29 +0000)
committerdrh <drh@noemail.net>
Mon, 24 Sep 2018 18:29:21 +0000 (18:29 +0000)
FossilOrigin-Name: 1c0ecbbdf1f309feaca747230d8925e61ddc6049a46c1dbbac7344bb933ab5e3

manifest
manifest.uuid
src/expr.c
test/window4.tcl
test/window4.test

index 3e896705b2b3521f39d5bf36f6506ea770e73812..0cdfcb48c79d967bca17c080538ac27b4b3026d3 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Version\s3.25.1
-D 2018-09-18T20:20:44.430
+C Fix\sa\sproblem\swith\sviews\sthat\suse\swindow\sfunctions\sas\spart\sof\scomplex\sexpressions.
+D 2018-09-24T18:29:21.187
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F Makefile.in 6b650013511fd9d8b094203ac268af9220d292cc7d4e1bc9fbca15aacd8c7995
@@ -453,7 +453,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957
 F src/dbpage.c 4aa7f26198934dbd002e69418220eae3dbc71b010bbac32bd78faf86b52ce6c3
 F src/dbstat.c edabb82611143727511a45ca0859b8cd037851ebe756ae3db289859dd18b6f91
 F src/delete.c 107e28d3ef8bd72fd11953374ca9107cd74e8b09c3ded076a6048742d26ce7d2
-F src/expr.c 92dc4e104b06d06ffeacbd1a4dc0a520daf37f6156278fb6ece5e90e2ca6b610
+F src/expr.c dad286e9fe4ffa9cc2dcbac069a3d8e1afa476d9ce58039a77e620aa64a6cfd6
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c f59253c0be4b1e9dfcb073b6d6d6ab83090ae50c08b5c113b76013c4b157cd6a
 F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f
@@ -1644,8 +1644,8 @@ F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3
 F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e
 F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823
 F test/window3.test e274b7f8952ca4ed25996e0e45c047192b066e0aaff2a822d4293c8c4f1d8d98
-F test/window4.tcl 871364059b7d320d556ec6ef804d604a4e8cc1547a3102c5d56067371bb200af
-F test/window4.test 323b118eb592932036388643ca6dcaead87f699bbea2984bbca49ba4ad6c2509
+F test/window4.tcl 511425f6b0abf9b953df54cc9c7295cc7c25d78f4ed6f7a74b094eec0120eccb
+F test/window4.test c5d6bf3403e4ade2f19df2afe4c16f29fb817c392c6c1c8017edb7165c191a62
 F test/window5.test 8187f46597c90b73e8f96659e893353cbda337479cc582f7a488eab351ba08d3
 F test/window6.test 7574778c79cae89f1781df237bf9ff5063886deca91a36efc53934315f0e7612
 F test/windowfault.test 23abad97b72c6f609002255ddd41ef5c8922408f918f9b98ad6005ab316e482f
@@ -1765,10 +1765,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
 F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
-P 36c75fd5b7cddb48be74f4f86fafe588b3e597a80d226eeb43b77cbd3817572e
-R 2da4c97a76733b95f6b50be3bc80d148
-T +bgcolor * #d0c0ff
-T +sym-release *
-T +sym-version-3.25.1 *
+P 2ac9003de44da7dafa3fbb1915ac5725a9275c86bf2f3b7aa19321bf1460b386
+Q +507d892c3a40a0bacbd47ed3c4fe2d8925a82716ae08da8401750a42782ba454
+R e4ae37cb413315ed71fa9fb13da95721
 U drh
-Z 021b437e4298407ebbfd74f9f32f7614
+Z 4419e50a781fbc54a0cdc0eebeaebd26
index 698c2190e7072eb8ec63f6a0fcc18c95357e5f15..a198ce46fee26e0a30a7eae1929202c78a984314 100644 (file)
@@ -1 +1 @@
-2ac9003de44da7dafa3fbb1915ac5725a9275c86bf2f3b7aa19321bf1460b386
\ No newline at end of file
+1c0ecbbdf1f309feaca747230d8925e61ddc6049a46c1dbbac7344bb933ab5e3
\ No newline at end of file
index 4777244024c46ec8628406e0605a12fd14b4ef7c..634fd8ed7a99496eec3b14cd2ef3fb67241d9f95 100644 (file)
@@ -1265,17 +1265,14 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){
     }
 
     /* Fill in pNew->pLeft and pNew->pRight. */
+    zAlloc += dupedExprNodeSize(p, dupFlags);
     if( ExprHasProperty(pNew, EP_Reduced|EP_TokenOnly) ){
-      zAlloc += dupedExprNodeSize(p, dupFlags);
       if( !ExprHasProperty(pNew, EP_TokenOnly|EP_Leaf) ){
         pNew->pLeft = p->pLeft ?
                       exprDup(db, p->pLeft, EXPRDUP_REDUCE, &zAlloc) : 0;
         pNew->pRight = p->pRight ?
                        exprDup(db, p->pRight, EXPRDUP_REDUCE, &zAlloc) : 0;
       }
-      if( pzBuffer ){
-        *pzBuffer = zAlloc;
-      }
     }else{
 #ifndef SQLITE_OMIT_WINDOWFUNC
       if( ExprHasProperty(p, EP_Reduced|EP_TokenOnly) ){
@@ -1295,6 +1292,9 @@ static Expr *exprDup(sqlite3 *db, Expr *p, int dupFlags, u8 **pzBuffer){
         pNew->pRight = sqlite3ExprDup(db, p->pRight, 0);
       }
     }
+    if( pzBuffer ){
+      *pzBuffer = zAlloc;
+    }
   }
   return pNew;
 }
index ea36735a09f51b4393662d0648ef98de608378d4..33b3a8c0e8849ca7e0043cd0fd0cd27325628b5e 100644 (file)
@@ -358,6 +358,32 @@ execsql_test 10.3 {
   SELECT id, lag(b, -1) OVER (PARTITION BY a ORDER BY id) FROM t7;
 }
 
+execsql_test 11.0 {
+  DROP VIEW IF EXISTS v8;
+  DROP TABLE IF EXISTS t8;
+  CREATE TABLE t8(t INT, total INT);
+  INSERT INTO t8 VALUES(0,2);
+  INSERT INTO t8 VALUES(5,1);
+  INSERT INTO t8 VALUES(10,1);
+}
+
+execsql_test 11.1 {
+  SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8;
+}
+
+execsql_test 11.2 {
+  CREATE VIEW v8 AS SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8;
+}
+
+execsql_test 11.3 {
+  SELECT * FROM v8;
+}
+
+execsql_test 11.4 {
+  SELECT * FROM (
+    SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8
+  ) sub;
+}
 
 
 finish_test
index 1933a32d094672c0202d8c0a2f48f1b11fb5a842..e914c7826cd86afaf55dcccff621d284c75a446d 100644 (file)
@@ -1217,13 +1217,20 @@ do_execsql_test 9.2 {
   SELECT dense_rank() OVER (PARTITION BY x) FROM t2
 } {1   1   1   1   1   1   1}
 
+
 do_test 9.3 {
   set myres {}
   foreach r [db eval {SELECT x, percent_rank() OVER (PARTITION BY x ORDER BY x) FROM t2}] {
-    lappend myres [format %.2f [set r]]
+    lappend myres [format %.4f [set r]]
+  }
+  set res2 {1.0000 0.0000 1.0000 0.0000 1.0000 0.0000 4.0000 0.0000 4.0000 0.0000 6.0000 0.0000 7.0000 0.0000}
+  foreach r [set myres] r2 [set res2] {
+    if {[set r]<([set r2]-0.0001) || [set r]>([set r2]+0.0001)} {
+      error "list element [set i] does not match: got=[set r] expected=[set r2]"
+    }
   }
-  set myres
-} {1.00 0.00 1.00 0.00 1.00 0.00 4.00 0.00 4.00 0.00 6.00 0.00 7.00 0.00}
+  set {} {}
+} {}
 
 do_execsql_test 9.4 {
   SELECT x, rank() OVER (ORDER BY x) FROM t2 ORDER BY 1,2
@@ -1233,21 +1240,35 @@ do_execsql_test 9.5 {
   SELECT DISTINCT x, rank() OVER (ORDER BY x) FROM t2 ORDER BY 1,2
 } {1 1   4 4   6 6   7 7}
 
+
 do_test 9.6 {
   set myres {}
   foreach r [db eval {SELECT percent_rank() OVER () FROM t1}] {
-    lappend myres [format %.2f [set r]]
+    lappend myres [format %.4f [set r]]
   }
-  set myres
-} {0.00 0.00 0.00}
+  set res2 {0.0000 0.0000 0.0000}
+  foreach r [set myres] r2 [set res2] {
+    if {[set r]<([set r2]-0.0001) || [set r]>([set r2]+0.0001)} {
+      error "list element [set i] does not match: got=[set r] expected=[set r2]"
+    }
+  }
+  set {} {}
+} {}
+
 
 do_test 9.7 {
   set myres {}
   foreach r [db eval {SELECT cume_dist() OVER () FROM t1}] {
-    lappend myres [format %.2f [set r]]
+    lappend myres [format %.4f [set r]]
+  }
+  set res2 {1.0000 1.0000 1.0000}
+  foreach r [set myres] r2 [set res2] {
+    if {[set r]<([set r2]-0.0001) || [set r]>([set r2]+0.0001)} {
+      error "list element [set i] does not match: got=[set r] expected=[set r2]"
+    }
   }
-  set myres
-} {1.00 1.00 1.00}
+  set {} {}
+} {}
 
 do_execsql_test 10.0 {
   DROP TABLE IF EXISTS t7;
@@ -1269,4 +1290,31 @@ do_execsql_test 10.3 {
   SELECT id, lag(b, -1) OVER (PARTITION BY a ORDER BY id) FROM t7;
 } {1 {}   2 4   3 {}   4 8   5 1   6 {}}
 
+do_execsql_test 11.0 {
+  DROP VIEW IF EXISTS v8;
+  DROP TABLE IF EXISTS t8;
+  CREATE TABLE t8(t INT, total INT);
+  INSERT INTO t8 VALUES(0,2);
+  INSERT INTO t8 VALUES(5,1);
+  INSERT INTO t8 VALUES(10,1);
+} {}
+
+do_execsql_test 11.1 {
+  SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8;
+} {0   1   2}
+
+do_execsql_test 11.2 {
+  CREATE VIEW v8 AS SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8;
+} {}
+
+do_execsql_test 11.3 {
+  SELECT * FROM v8;
+} {0   1   2}
+
+do_execsql_test 11.4 {
+  SELECT * FROM (
+    SELECT NTILE(256) OVER (ORDER BY total) - 1 AS nt FROM t8
+  ) sub;
+} {0   1   2}
+
 finish_test