1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-10 01:02:56 +03:00

Fix problems with sub-selects in WINDOW definitions. Also rename-column operations when the column being renamed appears in a WINDOW definition that is part of a VIEW or TRIGGER.

FossilOrigin-Name: 0387cb3add992b2028efe4f2100188d8f9fdfdcb233329857aa4b46a293cfc97
This commit is contained in:
dan
2019-01-23 16:59:24 +00:00
parent 4c7bdd1597
commit d99950310f
8 changed files with 144 additions and 32 deletions

View File

@@ -1,5 +1,5 @@
C Fix\sa\sbuffer\soverwrite\striggered\sby\sa\sprefix\squery\son\sa\scorrupt\sfts5\stable. C Fix\sproblems\swith\ssub-selects\sin\sWINDOW\sdefinitions.\sAlso\srename-column\soperations\swhen\sthe\scolumn\sbeing\srenamed\sappears\sin\sa\sWINDOW\sdefinition\sthat\sis\spart\sof\sa\sVIEW\sor\sTRIGGER.
D 2019-01-23T12:19:22.098 D 2019-01-23T16:59:24.350
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298 F Makefile.in 0e7c107ebcaff26681bc5bcf017557db85aa828d6f7fd652d748b7a78072c298
@@ -466,7 +466,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957
F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7
F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319
F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf
F src/expr.c 9c30765910bdff9d68ac580a4f2dc790da82308cb7798e57dc9e4bf5717d557c F src/expr.c 4bc508644845d2c9fb870e808df125b233a8d93d132c2184f8db0a034864325a
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765
F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63
@@ -512,7 +512,7 @@ F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13
F src/prepare.c 63b8395d728cc63c3fdc6cb98eb01e1ce84d66c46aa3c32f38332ea789429922 F src/prepare.c 63b8395d728cc63c3fdc6cb98eb01e1ce84d66c46aa3c32f38332ea789429922
F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381
F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
F src/resolve.c a40867ce07a9b58121d6f9a8fc969555d3c9bdcb6c2b5fc202670815af8dbd91 F src/resolve.c 12fca5d0b5474ae42e7c32e9f631a4937ac065ab755c56d7636857c376dd2057
F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
F src/select.c f7260c833c87c52ac187bc160ccc675a67d5a226cacd7eb1cdcb3c3ff25bde76 F src/select.c f7260c833c87c52ac187bc160ccc675a67d5a226cacd7eb1cdcb3c3ff25bde76
F src/shell.c.in 58f69c9143d9635a3d71a32c3d4cb6fad4de4f0ca400c098fa76ff83e3ec58cb F src/shell.c.in 58f69c9143d9635a3d71a32c3d4cb6fad4de4f0ca400c098fa76ff83e3ec58cb
@@ -598,7 +598,7 @@ F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa
F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9
F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f
F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a
F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66 F src/walker.c ec63d6e2857a542523bcc1472e9817c4da003f4c450ea4885f6e41b4b577a64a
F src/where.c c5d201699d03be61c35bc04b96e481b1c8dc68177617ca1db156ef7409da2fae F src/where.c c5d201699d03be61c35bc04b96e481b1c8dc68177617ca1db156ef7409da2fae
F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88
F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811 F src/wherecode.c 89d2ec668aec884dfa7ac500c6744e42ec0590fcd72fb740a8b48326a8412811
@@ -622,7 +622,8 @@ F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3
F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9
F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b
F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a
F test/altertab2.test 2465aac70cedb14335a45e39fef9f7118e4726b6cb1614db36cba014f63bdec2 F test/altertab2.test 7bedde2e6e71fdecd7a2af64b696cd0b3d3a344f5cf1db6785d9e3b5665193cf
F test/altertab3.test b27923ad48b05f70364ddd8f4bdb6ee5e411e13d23badb74ccff048648b11986
F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f
F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c
F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8
@@ -1672,7 +1673,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2
F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc
F test/window1.test 9003bb759662f905ef5a34fb9305016edf0fe506e961e5e570b6487f8b2b7cd0 F test/window1.test 2798c8249e0f122c9bacce6aa7324765a5cd9106e49e7aacc81f6033d281577b
F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143 F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143
F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e
F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823 F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823
@@ -1801,7 +1802,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
P 1abc4415648e69362061e9f9a4f2c1d419ba33801999b377650d8b9a4d2d3a7c P 1d8172a94bce2d067027685e5aa1dc8f5d5d55b5da0832ad2836f6939de68c8f
R 0baabbcf477468e2b69335f87d712e01 R 6c9c2637612c06986c005a8ea0b9a370
U dan U dan
Z 6522022d703f7d994429368b0b708ee0 Z 6cff79c887bd13174b7d97ad18aec26e

View File

@@ -1 +1 @@
1d8172a94bce2d067027685e5aa1dc8f5d5d55b5da0832ad2836f6939de68c8f 0387cb3add992b2028efe4f2100188d8f9fdfdcb233329857aa4b46a293cfc97

View File

@@ -5366,6 +5366,7 @@ void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){
w.xSelectCallback2 = analyzeAggregatesInSelectEnd; w.xSelectCallback2 = analyzeAggregatesInSelectEnd;
w.walkerDepth = 0; w.walkerDepth = 0;
w.u.pNC = pNC; w.u.pNC = pNC;
w.pParse = 0;
assert( pNC->pSrcList!=0 ); assert( pNC->pSrcList!=0 );
sqlite3WalkExpr(&w, pExpr); sqlite3WalkExpr(&w, pExpr);
} }

View File

@@ -858,10 +858,10 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){
#ifndef SQLITE_OMIT_WINDOWFUNC #ifndef SQLITE_OMIT_WINDOWFUNC
if( pExpr->y.pWin ){ if( pExpr->y.pWin ){
Select *pSel = pNC->pWinSelect; Select *pSel = pNC->pWinSelect;
sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.pWin, pDef);
sqlite3WalkExprList(pWalker, pExpr->y.pWin->pPartition); sqlite3WalkExprList(pWalker, pExpr->y.pWin->pPartition);
sqlite3WalkExprList(pWalker, pExpr->y.pWin->pOrderBy); sqlite3WalkExprList(pWalker, pExpr->y.pWin->pOrderBy);
sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter); sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter);
sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.pWin, pDef);
if( 0==pSel->pWin if( 0==pSel->pWin
|| 0==sqlite3WindowCompare(pParse, pSel->pWin, pExpr->y.pWin) || 0==sqlite3WindowCompare(pParse, pSel->pWin, pExpr->y.pWin)
){ ){
@@ -1536,6 +1536,17 @@ static int resolveSelectStep(Walker *pWalker, Select *p){
} }
} }
if( IN_RENAME_OBJECT ){
Window *pWin;
for(pWin=p->pWinDefn; pWin; pWin=pWin->pNextWin){
if( sqlite3ResolveExprListNames(&sNC, pWin->pOrderBy)
|| sqlite3ResolveExprListNames(&sNC, pWin->pPartition)
){
return WRC_Abort;
}
}
}
/* If this is part of a compound SELECT, check that it has the right /* If this is part of a compound SELECT, check that it has the right
** number of expressions in the select list. */ ** number of expressions in the select list. */
if( p->pNext && p->pEList->nExpr!=p->pNext->pEList->nExpr ){ if( p->pNext && p->pEList->nExpr!=p->pNext->pEList->nExpr ){

View File

@@ -17,6 +17,22 @@
#include <string.h> #include <string.h>
#if !defined(SQLITE_OMIT_WINDOWFUNC)
/*
** Walk all expressions linked into the list of Window objects passed
** as the second argument.
*/
static int walkWindowList(Walker *pWalker, Window *pList){
Window *pWin;
for(pWin=pList; pWin; pWin=pWin->pNextWin){
if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort;
if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort;
if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort;
}
return WRC_Continue;
}
#endif
/* /*
** Walk an expression tree. Invoke the callback once for each node ** Walk an expression tree. Invoke the callback once for each node
** of the expression, while descending. (In other words, the callback ** of the expression, while descending. (In other words, the callback
@@ -56,10 +72,7 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){
} }
#ifndef SQLITE_OMIT_WINDOWFUNC #ifndef SQLITE_OMIT_WINDOWFUNC
if( ExprHasProperty(pExpr, EP_WinFunc) ){ if( ExprHasProperty(pExpr, EP_WinFunc) ){
Window *pWin = pExpr->y.pWin; if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort;
if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort;
if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort;
if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort;
} }
#endif #endif
} }
@@ -99,6 +112,14 @@ int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){
if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort; if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort;
if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort; if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort;
if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort; if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort;
#if !defined(SQLITE_OMIT_WINDOWFUNC) && !defined(SQLITE_OMIT_ALTERTABLE)
{
Parse *pParse = pWalker->pParse;
if( pParse && IN_RENAME_OBJECT ){
if( walkWindowList(pWalker, p->pWinDefn) ) return WRC_Abort;
}
}
#endif
return WRC_Continue; return WRC_Continue;
} }

View File

@@ -182,33 +182,35 @@ do_execsql_test 4.3 {
do_execsql_test 5.0 { do_execsql_test 5.0 {
CREATE TABLE t2(a); CREATE TABLE t2(a);
CREATE TRIGGER r2 AFTER INSERT ON t2 WHEN new.a NOT NULL BEGIN CREATE TRIGGER r2 AFTER INSERT ON t2 WHEN new.a NOT NULL BEGIN
SELECT a, rank() OVER w1 FROM t2 SELECT a, sum(a) OVER w1 FROM t2
WINDOW w1 AS ( WINDOW w1 AS (
PARTITION BY b ORDER BY d ROWS BETWEEN 2 PRECEDING AND a FOLLOWING PARTITION BY a ORDER BY a
ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING
), ),
w2 AS ( w2 AS (
PARTITION BY b PARTITION BY a
ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
); );
END; END;
} {} } {}
do_catchsql_test 5.0.1 { do_execsql_test 5.0.1 {
INSERT INTO t2 VALUES(1); INSERT INTO t2 VALUES(1);
} {1 {no such column: b}} } {}
do_execsql_test 5.1 { do_execsql_test 5.1 {
ALTER TABLE t2 RENAME TO t2x; ALTER TABLE t2 RENAME TO t2x;
SELECT sql FROM sqlite_master WHERE name = 'r2'; SELECT sql FROM sqlite_master WHERE name = 'r2';
} { } {
{CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.a NOT NULL BEGIN {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.a NOT NULL BEGIN
SELECT a, rank() OVER w1 FROM "t2x" SELECT a, sum(a) OVER w1 FROM "t2x"
WINDOW w1 AS ( WINDOW w1 AS (
PARTITION BY b ORDER BY d ROWS BETWEEN 2 PRECEDING AND a FOLLOWING PARTITION BY a ORDER BY a
ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING
), ),
w2 AS ( w2 AS (
PARTITION BY b PARTITION BY a
ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
); );
END} END}
} }
@@ -218,20 +220,21 @@ do_execsql_test 5.2 {
SELECT sql FROM sqlite_master WHERE name = 'r2'; SELECT sql FROM sqlite_master WHERE name = 'r2';
} { } {
{CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.aaaa NOT NULL BEGIN {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.aaaa NOT NULL BEGIN
SELECT aaaa, rank() OVER w1 FROM "t2x" SELECT aaaa, sum(aaaa) OVER w1 FROM "t2x"
WINDOW w1 AS ( WINDOW w1 AS (
PARTITION BY b ORDER BY d ROWS BETWEEN 2 PRECEDING AND a FOLLOWING PARTITION BY aaaa ORDER BY aaaa
ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING
), ),
w2 AS ( w2 AS (
PARTITION BY b PARTITION BY aaaa
ORDER BY d ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING
); );
END} END}
} }
do_catchsql_test 5.3 { do_execsql_test 5.3 {
INSERT INTO t2x VALUES(1); INSERT INTO t2x VALUES(1);
} {1 {no such column: b}} } {}
#------------------------------------------------------------------------- #-------------------------------------------------------------------------

47
test/altertab3.test Normal file
View File

@@ -0,0 +1,47 @@
# 2019 January 23
#
# The author disclaims copyright to this source code. In place of
# a legal notice, here is a blessing:
#
# May you do good and not evil.
# May you find forgiveness for yourself and forgive others.
# May you share freely, never taking more than you give.
#
#*************************************************************************
#
set testdir [file dirname $argv0]
source $testdir/tester.tcl
set testprefix altertab3
# If SQLITE_OMIT_ALTERTABLE is defined, omit this file.
ifcapable !altertable {
finish_test
return
}
do_execsql_test 1.0 {
CREATE TABLE t1(a, b);
CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN
SELECT sum(b) OVER w FROM t1 WINDOW w AS (ORDER BY a);
END;
}
do_execsql_test 1.1 {
ALTER TABLE t1 RENAME a TO aaa;
}
do_execsql_test 1.2 {
SELECT sql FROM sqlite_master WHERE name='tr1'
} {{CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN
SELECT sum(b) OVER w FROM t1 WINDOW w AS (ORDER BY aaa);
END}}
do_execsql_test 1.3 {
INSERT INTO t1 VALUES(1, 2);
}
finish_test

View File

@@ -673,4 +673,32 @@ do_execsql_test 15.2 {
) x WHERE x+x; ) x WHERE x+x;
} {} } {}
#-------------------------------------------------------------------------
do_execsql_test 16.0 {
CREATE TABLE t7(a,b);
INSERT INTO t7(rowid, a, b) VALUES
(1, 1, 3),
(2, 10, 4),
(3, 100, 2);
}
do_execsql_test 16.1 {
SELECT rowid, sum(a) OVER (PARTITION BY b IN (SELECT rowid FROM t7)) FROM t7;
} {
2 10
1 101
3 101
}
do_execsql_test 16.2 {
SELECT rowid, sum(a) OVER w1 FROM t7
WINDOW w1 AS (PARTITION BY b IN (SELECT rowid FROM t7));
} {
2 10
1 101
3 101
}
finish_test finish_test