Fix problems with using window functions in CREATE VIEW statements.
FossilOrigin-Name: 943bccd2a6bd4cf3e0534c1fa46885bfa2ba7b780ddcdff9f1ea4cbb3f04e786
This commit is contained in:
parent
f87e10c75e
commit
c95f38d456
18
manifest
18
manifest
@ -1,5 +1,5 @@
|
||||
C Ensure\sthat\sall\sfour\scallbacks\sare\sprovided\swhen\sregistering\sa\swindow\sfunction\n(otherwise\sSQLITE_MISUSE\sis\sreturned).
|
||||
D 2018-06-18T17:36:41.529
|
||||
C Fix\sproblems\swith\susing\swindow\sfunctions\sin\sCREATE\sVIEW\sstatements.
|
||||
D 2018-06-18T20:34:43.117
|
||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||
F Makefile.in 0a3a6c81e6fcb969ff9106e882f0a08547014ba463cb6beca4c4efaecc924ee6
|
||||
@ -447,7 +447,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957
|
||||
F src/dbpage.c 4aa7f26198934dbd002e69418220eae3dbc71b010bbac32bd78faf86b52ce6c3
|
||||
F src/dbstat.c edabb82611143727511a45ca0859b8cd037851ebe756ae3db289859dd18b6f91
|
||||
F src/delete.c 4c8c7604277a2041647f96b78f4b9a47858e9217e4fb333d35e7b5ab32c5b57f
|
||||
F src/expr.c 80c61121f3c87427e8c79a6ed0352e610e5a734508c2a094a6bf30ebca18ef1e
|
||||
F src/expr.c 02e1fb65a7154e8e224cc50828472a336f01f98b6ae09467fe936e2a154d3433
|
||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||
F src/fkey.c b1da9ef8dc834603bb0d28972378a7ce65897847f9a1e89ab800bbdf24c788ee
|
||||
F src/func.c f1c244ba44950d94d4c2298903d16ca7ae3183bcf07936a9e01ab4f3f10b53e2
|
||||
@ -500,7 +500,7 @@ F src/shell.c.in 8578421c5fb2a972461b2a996f7173646e55e0dbd2a2eee30c8f5dc7d3dbadf
|
||||
F src/sqlite.h.in 8dbfe617b70b01e661a9ba0b805facb1430df80096ea7508cf7903878b45e689
|
||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||
F src/sqlite3ext.h 9887b27e69c01e79c2cbe74ef73bf01af5b5703d6a7f0a4371e386d7249cb1c7
|
||||
F src/sqliteInt.h 94c8db9e2bfc0f9bead6c3c4f8c6172c93274b13b6388a840b1820590f7a62b0
|
||||
F src/sqliteInt.h 6080a69e0f994f588edb89f59a65711804fd29349e74bae0bfa9e5db6fdf120e
|
||||
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
||||
F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e
|
||||
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
||||
@ -584,7 +584,7 @@ F src/where.c 0bcbf9e191ca07f9ea2008aa80e70ded46bcdffd26560c83397da501f00aece6
|
||||
F src/whereInt.h b90ef9b9707ef750eab2a7a080c48fb4900315033274689def32d0cf5a81ebe4
|
||||
F src/wherecode.c 3317f2b083a66d3e65a03edf316ade4ccb0a99c9956273282ebb579b95d4ba96
|
||||
F src/whereexpr.c 19cf35cdd9bf6d5589d8a5c960d99259761136187a2319a6e14d11cf1abe14c2
|
||||
F src/window.c 7cd40b85402c84d89dfbbcc06700e4879673583ac33b487f172974a2c4cb6d41
|
||||
F src/window.c 32a747702eed5cfb2184f8932d93d5a0688ab48076bc3c7ac90325647bc72304
|
||||
F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2
|
||||
F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd
|
||||
F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d
|
||||
@ -1618,7 +1618,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2
|
||||
F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972
|
||||
F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d
|
||||
F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc
|
||||
F test/window1.test af17e84722f8a8d525912056c9d6c7ee215d5474d9a9ecd729b761279a3f924f
|
||||
F test/window1.test f6624f97903a0222722d1766e8e532fdc7845cde14f29a1d465978c2e4b1bb87
|
||||
F test/window2.tcl 0983de5eade5eeda49469244799d5331bfe3199fca3f6c6d2a836aa08f4fba1b
|
||||
F test/window2.test 79747b2edde4ad424e0752b27529aedc86e91f3d8d88846fa17ff0cb67f65086
|
||||
F test/window3.tcl 654d61d73e10db089b22514d498bb23ec310f720c0f4b5f69f67fda83d672048
|
||||
@ -1743,7 +1743,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 da03fb4318fd2613ec5c5b109a3974ac1120c19ed16bed4ca85bbdc4b35c998c
|
||||
R 505b651a8de9b2f900040d7de80574dc
|
||||
P 5720dcd8b111b1f8712c8fb4b441ccb129e838db8c26a6e9e0f095dc6a851f6b
|
||||
R 6e5da45464aff0125995ddaf37c7d2ce
|
||||
U dan
|
||||
Z df8b31cd85e7749a47751056b05d5961
|
||||
Z e83fb6fe2c3abd6b6a47ea2ddd2f633a
|
||||
|
@ -1 +1 @@
|
||||
5720dcd8b111b1f8712c8fb4b441ccb129e838db8c26a6e9e0f095dc6a851f6b
|
||||
943bccd2a6bd4cf3e0534c1fa46885bfa2ba7b780ddcdff9f1ea4cbb3f04e786
|
@ -1116,7 +1116,7 @@ static int exprStructSize(Expr *p){
|
||||
** Note that with flags==EXPRDUP_REDUCE, this routines works on full-size
|
||||
** (unreduced) Expr objects as they or originally constructed by the parser.
|
||||
** During expression analysis, extra information is computed and moved into
|
||||
** later parts of teh Expr object and that extra information might get chopped
|
||||
** later parts of the Expr object and that extra information might get chopped
|
||||
** off if the expression is reduced. Note also that it does not work to
|
||||
** make an EXPRDUP_REDUCE copy of a reduced expression. It is only legal
|
||||
** to reduce a pristine expression tree from the parser. The implementation
|
||||
@ -1128,7 +1128,7 @@ static int dupedExprStructSize(Expr *p, int flags){
|
||||
assert( flags==EXPRDUP_REDUCE || flags==0 ); /* Only one flag value allowed */
|
||||
assert( EXPR_FULLSIZE<=0xfff );
|
||||
assert( (0xfff & (EP_Reduced|EP_TokenOnly))==0 );
|
||||
if( 0==flags || p->op==TK_SELECT_COLUMN ){
|
||||
if( 0==flags || p->op==TK_SELECT_COLUMN || p->pWin ){
|
||||
nSize = EXPR_FULLSIZE;
|
||||
}else{
|
||||
assert( !ExprHasProperty(p, EP_TokenOnly|EP_Reduced) );
|
||||
@ -1480,7 +1480,7 @@ Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){
|
||||
pNew->nSelectRow = p->nSelectRow;
|
||||
pNew->pWith = withDup(db, p->pWith);
|
||||
pNew->pWin = 0;
|
||||
pNew->pWinDefn = 0; /* TODO!! */
|
||||
pNew->pWinDefn = sqlite3WindowListDup(db, p->pWinDefn);
|
||||
sqlite3SelectSetName(pNew, p->zSelName);
|
||||
*pp = pNew;
|
||||
pp = &pNew->pPrior;
|
||||
|
@ -3528,6 +3528,7 @@ int sqlite3WindowRewrite(Parse*, Select*);
|
||||
int sqlite3ExpandSubquery(Parse*, struct SrcList_item*);
|
||||
void sqlite3WindowUpdate(Parse*, Window*, Window*, FuncDef*);
|
||||
Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p);
|
||||
Window *sqlite3WindowListDup(sqlite3 *db, Window *p);
|
||||
void sqlite3WindowFunctions(void);
|
||||
|
||||
/*
|
||||
|
23
src/window.c
23
src/window.c
@ -503,7 +503,7 @@ void sqlite3WindowUpdate(
|
||||
Window *pWin, /* Window frame to update */
|
||||
FuncDef *pFunc /* Window function definition */
|
||||
){
|
||||
if( pWin->zName ){
|
||||
if( pWin->zName && pWin->eType==0 ){
|
||||
Window *p;
|
||||
for(p=pList; p; p=p->pNextWin){
|
||||
if( sqlite3StrICmp(p->zName, pWin->zName)==0 ) break;
|
||||
@ -518,6 +518,7 @@ void sqlite3WindowUpdate(
|
||||
pWin->pEnd = sqlite3ExprDup(pParse->db, p->pEnd, 0);
|
||||
pWin->eStart = p->eStart;
|
||||
pWin->eEnd = p->eEnd;
|
||||
pWin->eType = p->eType;
|
||||
}
|
||||
if( pFunc->funcFlags & SQLITE_FUNC_WINDOW ){
|
||||
sqlite3 *db = pParse->db;
|
||||
@ -800,6 +801,7 @@ Window *sqlite3WindowAlloc(
|
||||
Window *pWin = (Window*)sqlite3DbMallocZero(pParse->db, sizeof(Window));
|
||||
|
||||
if( pWin ){
|
||||
assert( eType );
|
||||
pWin->eType = eType;
|
||||
pWin->eStart = eStart;
|
||||
pWin->eEnd = eEnd;
|
||||
@ -1918,6 +1920,7 @@ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){
|
||||
if( p ){
|
||||
pNew = sqlite3DbMallocZero(db, sizeof(Window));
|
||||
if( pNew ){
|
||||
pNew->zName = sqlite3DbStrDup(db, p->zName);
|
||||
pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0);
|
||||
pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0);
|
||||
pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0);
|
||||
@ -1932,6 +1935,24 @@ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){
|
||||
return pNew;
|
||||
}
|
||||
|
||||
/*
|
||||
** Return a copy of the linked list of Window objects passed as the
|
||||
** second argument.
|
||||
*/
|
||||
Window *sqlite3WindowListDup(sqlite3 *db, Window *p){
|
||||
Window *pWin;
|
||||
Window *pRet = 0;
|
||||
Window **pp = &pRet;
|
||||
|
||||
for(pWin=p; pWin; pWin=pWin->pNextWin){
|
||||
*pp = sqlite3WindowDup(db, 0, pWin);
|
||||
if( *pp==0 ) break;
|
||||
pp = &((*pp)->pNextWin);
|
||||
}
|
||||
|
||||
return pRet;
|
||||
}
|
||||
|
||||
/*
|
||||
** sqlite3WhereBegin() has already been called for the SELECT statement
|
||||
** passed as the second argument when this function is invoked. It generates
|
||||
|
@ -269,6 +269,7 @@ do_execsql_test 7.3 {
|
||||
SELECT row_number() OVER (ORDER BY x) FROM t1
|
||||
} {1 2 3 4 5}
|
||||
|
||||
breakpoint
|
||||
do_execsql_test 7.4 {
|
||||
SELECT
|
||||
row_number() OVER win,
|
||||
@ -277,5 +278,46 @@ do_execsql_test 7.4 {
|
||||
WINDOW win AS (ORDER BY x ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
|
||||
} {1 3 2 5 3 7 4 9 5 {}}
|
||||
|
||||
#-------------------------------------------------------------------------
|
||||
# Attempt to use a window function in a view.
|
||||
#
|
||||
do_execsql_test 8.0 {
|
||||
CREATE TABLE t3(a, b, c);
|
||||
|
||||
WITH s(i) AS ( VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<6 )
|
||||
INSERT INTO t3 SELECT i, i, i FROM s;
|
||||
|
||||
CREATE VIEW v1 AS SELECT
|
||||
sum(b) OVER (ORDER BY c),
|
||||
min(b) OVER (ORDER BY c),
|
||||
max(b) OVER (ORDER BY c)
|
||||
FROM t3;
|
||||
|
||||
CREATE VIEW v2 AS SELECT
|
||||
sum(b) OVER win,
|
||||
min(b) OVER win,
|
||||
max(b) OVER win
|
||||
FROM t3
|
||||
WINDOW win AS (ORDER BY c);
|
||||
}
|
||||
|
||||
do_execsql_test 8.1.1 {
|
||||
SELECT * FROM v1
|
||||
} {1 1 1 3 1 2 6 1 3 10 1 4 15 1 5 21 1 6}
|
||||
do_execsql_test 8.1.2 {
|
||||
SELECT * FROM v2
|
||||
} {1 1 1 3 1 2 6 1 3 10 1 4 15 1 5 21 1 6}
|
||||
|
||||
db close
|
||||
sqlite3 db test.db
|
||||
do_execsql_test 8.2.1 {
|
||||
SELECT * FROM v1
|
||||
} {1 1 1 3 1 2 6 1 3 10 1 4 15 1 5 21 1 6}
|
||||
do_execsql_test 8.2.2 {
|
||||
SELECT * FROM v2
|
||||
} {1 1 1 3 1 2 6 1 3 10 1 4 15 1 5 21 1 6}
|
||||
|
||||
|
||||
|
||||
finish_test
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user