aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordan <dan@noemail.net>2019-01-16 12:05:22 +0000
committerdan <dan@noemail.net>2019-01-16 12:05:22 +0000
commitfb8ac325d769248e45eaa056adf4da9960bdd9c3 (patch)
tree32b8d92db78938aae48ba740de95df2b4c45a81d
parent4ccb41fc999170823e6c064f5aecd87123a94a44 (diff)
downloadsqlite-fb8ac325d769248e45eaa056adf4da9960bdd9c3.tar.gz
sqlite-fb8ac325d769248e45eaa056adf4da9960bdd9c3.zip
Avoid a dangling pointer comparison when renaming a table that has a trigger
that itself contains a window function with an (illegal) column reference in a FOLLOWING expression. FossilOrigin-Name: d45bee36f2c1091a2d32c16ca8921bf4e7c9e40c46d0a36fbcb179ecfafcfbf0
-rw-r--r--manifest14
-rw-r--r--manifest.uuid2
-rw-r--r--src/window.c1
-rw-r--r--test/altertab2.test55
4 files changed, 64 insertions, 8 deletions
diff --git a/manifest b/manifest
index 2f65c2103..f6365765e 100644
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\smemory\sleak\sthat\scould\soccur\sin\sfts3\swhen\shandling\sa\scorrupt\sdatabase.
-D 2019-01-16T11:38:06.827
+C Avoid\sa\sdangling\spointer\scomparison\swhen\srenaming\sa\stable\sthat\shas\sa\strigger\nthat\sitself\scontains\sa\swindow\sfunction\swith\san\s(illegal)\scolumn\sreference\sin\sa\nFOLLOWING\sexpression.
+D 2019-01-16T12:05:22.604
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in 2a9d0331ab57c68173a4c2fe9046fe89c4d916a888e04dd7a2d36958c2bff777
@@ -602,7 +602,7 @@ F src/where.c dc293ea4230adf9a323fb2e5750eff565347567a3cd6538f7d0fa93b11c2baae
F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88
F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811
F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442
-F src/window.c f4a9ac8396395a9e281e182dd32fc9b3b19f6762a9eef468137369def3ad9a2c
+F src/window.c 5950fb4dd9fd5dcefffd082fa2b8832ca8bef2d2297a151929ce06aeb4f58139
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
@@ -621,7 +621,7 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3
F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9
F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b
F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a
-F test/altertab2.test 4e40836ce90c9533e03be8417f3b02c2655ea96c375769cda9caaed464f234ea
+F test/altertab2.test d0c8e6bd57bc793b28c67fd0cc2b34f039eca63e0717d5a20b90de72db16d4f4
F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f
F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c
F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8
@@ -1800,7 +1800,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 cc6cd7531fee39b4c2a9f522f1089c1d79254a9e25acae59468322031f94c25a
-R 9d97df2ed07a429d41da3f8f4293bdef
+P 65cebb06a0afcbcb4157c3d518a62ed188b1e90d9e9b69d88fece484bcb6e380
+R fc37f453249cb59477400146e257a7aa
U dan
-Z 6b7ccb309f8678351899affe1574755c
+Z f0bcf5ec07a101d656c599001621d54c
diff --git a/manifest.uuid b/manifest.uuid
index caf6c0c60..a12f6bda2 100644
--- a/manifest.uuid
+++ b/manifest.uuid
@@ -1 +1 @@
-65cebb06a0afcbcb4157c3d518a62ed188b1e90d9e9b69d88fece484bcb6e380 \ No newline at end of file
+d45bee36f2c1091a2d32c16ca8921bf4e7c9e40c46d0a36fbcb179ecfafcfbf0 \ No newline at end of file
diff --git a/src/window.c b/src/window.c
index c510c73aa..18a4f7054 100644
--- a/src/window.c
+++ b/src/window.c
@@ -881,6 +881,7 @@ void sqlite3WindowListDelete(sqlite3 *db, Window *p){
*/
static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *pExpr){
if( 0==sqlite3ExprIsConstant(pExpr) ){
+ if( IN_RENAME_OBJECT ) sqlite3RenameExprUnmap(pParse, pExpr);
sqlite3ExprDelete(pParse->db, pExpr);
pExpr = sqlite3ExprAlloc(pParse->db, TK_NULL, 0, 0);
}
diff --git a/test/altertab2.test b/test/altertab2.test
index 2c828be99..f1f131c23 100644
--- a/test/altertab2.test
+++ b/test/altertab2.test
@@ -178,4 +178,59 @@ do_execsql_test 4.3 {
END}
}
+#-------------------------------------------------------------------------
+do_execsql_test 5.0 {
+ CREATE TABLE t2(a);
+ CREATE TRIGGER r2 AFTER INSERT ON t2 WHEN new.a NOT NULL BEGIN
+ SELECT a, rank() OVER w1 FROM t2
+ WINDOW w1 AS (
+ PARTITION BY b ORDER BY d ROWS BETWEEN 2 PRECEDING AND a FOLLOWING
+ ),
+ w2 AS (
+ PARTITION BY b
+ ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
+ );
+ END;
+} {}
+
+do_catchsql_test 5.0.1 {
+ INSERT INTO t2 VALUES(1);
+} {1 {no such column: b}}
+
+do_execsql_test 5.1 {
+ ALTER TABLE t2 RENAME TO t2x;
+ SELECT sql FROM sqlite_master WHERE name = 'r2';
+} {
+ {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.a NOT NULL BEGIN
+ SELECT a, rank() OVER w1 FROM "t2x"
+ WINDOW w1 AS (
+ PARTITION BY b ORDER BY d ROWS BETWEEN 2 PRECEDING AND a FOLLOWING
+ ),
+ w2 AS (
+ PARTITION BY b
+ ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
+ );
+ END}
+}
+
+do_execsql_test 5.2 {
+ ALTER TABLE t2x RENAME a TO aaaa;
+ SELECT sql FROM sqlite_master WHERE name = 'r2';
+} {
+ {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.aaaa NOT NULL BEGIN
+ SELECT aaaa, rank() OVER w1 FROM "t2x"
+ WINDOW w1 AS (
+ PARTITION BY b ORDER BY d ROWS BETWEEN 2 PRECEDING AND a FOLLOWING
+ ),
+ w2 AS (
+ PARTITION BY b
+ ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
+ );
+ END}
+}
+
+do_catchsql_test 5.3 {
+ INSERT INTO t2x VALUES(1);
+} {1 {no such column: b}}
+
finish_test