From: dan Date: Wed, 15 Jan 2014 15:27:51 +0000 (+0000) Subject: Return an error if a CTE specifies a different number of columns than its SELECT... X-Git-Tag: version-3.8.3~45^2~14 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=60e7068d75acc643cfd045a7cb90d635079f3457;p=thirdparty%2Fsqlite.git Return an error if a CTE specifies a different number of columns than its SELECT statement returns. FossilOrigin-Name: 9a514b50e4b01f109fbdb0aabcbfe1ddab129b44 --- diff --git a/manifest b/manifest index c853513dbd..d314554380 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Don't\stry\sto\sverify\sthe\sschema\sof\stransient\stable\s(such\sas\sgenerated\sinside\na\sWITH\sclause)\swhen\sgenerating\scode\sfor\s"IN\stable"\soperators. -D 2014-01-15T14:40:41.242 +C Return\san\serror\sif\sa\sCTE\sspecifies\sa\sdifferent\snumber\sof\scolumns\sthan\sits\sSELECT\sstatement\sreturns. +D 2014-01-15T15:27:51.337 F Makefile.arm-wince-mingw32ce-gcc d6df77f1f48d690bd73162294bbba7f59507c72f F Makefile.in 2ef13430cd359f7b361bb863504e227b25cc7f81 F Makefile.linux-gcc 91d710bdc4998cb015f39edf3cb314ec4f4d7e23 @@ -219,7 +219,7 @@ F src/printf.c 85d07756e45d7496d19439dcae3e6e9e0090f269 F src/random.c d10c1f85b6709ca97278428fd5db5bbb9c74eece F src/resolve.c 7eda9097b29fcf3d2b42fdc17d1de672134e09b6 F src/rowset.c 64655f1a627c9c212d9ab497899e7424a34222e0 -F src/select.c 51c74176eb949d1ff5797735acedd6c08d19450a +F src/select.c 7d0d85f5d0a0f35be49230a3b6609fa534980015 F src/shell.c a3541193d5fce37e91dad8ef46a9505aa7c9b344 F src/sqlite.h.in d94a8b89522f526ba711182ee161e06f8669bcc9 F src/sqlite3.rc 11094cc6a157a028b301a9f06b3d03089ea37c3e @@ -1091,7 +1091,7 @@ F test/wild001.test bca33f499866f04c24510d74baf1e578d4e44b1c F test/win32heap.test ea19770974795cff26e11575e12d422dbd16893c F test/win32lock.test 7a6bd73a5dcdee39b5bb93e92395e1773a194361 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d -F test/with1.test 77739a9e5e88873e7655634297d9dc4360334f9a +F test/with1.test babb3d9c4007596d2d74468e001b1dc02d1ada91 F test/withM.test ac3ec7ee0b33a02d0fa15da91214d97ddea64e34 F test/without_rowid1.test aaa26da19d543cd8d3d2d0e686dfa255556c15c8 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 @@ -1150,7 +1150,7 @@ F tool/vdbe-compress.tcl 0cf56e9263a152b84da86e75a5c0cdcdb7a47891 F tool/warnings-clang.sh f6aa929dc20ef1f856af04a730772f59283631d4 F tool/warnings.sh d1a6de74685f360ab718efda6265994b99bbea01 F tool/win/sqlite.vsix 030f3eeaf2cb811a3692ab9c14d021a75ce41fff -P 9472f6d820a7fb233936d9b8f7a39c9d4c4d6d73 -R 719190df89fa0f9b34e7fe5eb5626240 -U drh -Z 58f028530f5aaa7c16053558b5f5262a +P 860aa936634a60d68e3954fc408a96a9260394e0 +R 0c042289cd11db254af8c2a3a3653738 +U dan +Z d4b370476cdc85ae036fb519ef522aac diff --git a/manifest.uuid b/manifest.uuid index cc099a86d2..2aac3c13b1 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -860aa936634a60d68e3954fc408a96a9260394e0 \ No newline at end of file +9a514b50e4b01f109fbdb0aabcbfe1ddab129b44 \ No newline at end of file diff --git a/src/select.c b/src/select.c index 35edcbb03c..34a2297c96 100644 --- a/src/select.c +++ b/src/select.c @@ -3556,6 +3556,7 @@ static int withExpand( }else{ ExprList *pEList; Select *pSel; + Select *pLeft; /* Left-most SELECT statement */ int bRecursive; pFrom->pTab = pTab = sqlite3DbMallocZero(db, sizeof(Table)); @@ -3579,13 +3580,18 @@ static int withExpand( sqlite3WalkSelect(pWalker, pSel); } + for(pLeft=pSel; pLeft->pPrior; pLeft=pLeft->pPrior); + pEList = pLeft->pEList; if( pCte->pCols ){ + if( pEList->nExpr!=pCte->pCols->nExpr ){ + sqlite3ErrorMsg(pParse, "cte \"%s\" returns %d values for %d columns", + pCte->zName, pEList->nExpr, pCte->pCols->nExpr + ); + return WRC_Abort; + } pEList = pCte->pCols; - }else{ - Select *pLeft; - for(pLeft=pSel; pLeft->pPrior; pLeft=pLeft->pPrior); - pEList = pLeft->pEList; } + selectColumnsFromExprList(pParse, pEList, &pTab->nCol, &pTab->aCol); if( bRecursive ){ diff --git a/test/with1.test b/test/with1.test index 480afa8074..dd1d5c0ab0 100644 --- a/test/with1.test +++ b/test/with1.test @@ -164,6 +164,42 @@ do_execsql_test 5.5 { SELECT x FROM i LIMIT 20; } {1 2 3 4 5 6 7 8 9 0} +do_catchsql_test 5.6.1 { + WITH i(x, y) AS ( VALUES(1) ) + SELECT * FROM i; +} {1 {cte "i" returns 1 values for 2 columns}} + +do_catchsql_test 5.6.2 { + WITH i(x) AS ( VALUES(1,2) ) + SELECT * FROM i; +} {1 {cte "i" returns 2 values for 1 columns}} + +do_catchsql_test 5.6.3 { + CREATE TABLE t5(a, b); + WITH i(x) AS ( SELECT * FROM t5 ) + SELECT * FROM i; +} {1 {cte "i" returns 2 values for 1 columns}} + +do_catchsql_test 5.6.4 { + WITH i(x) AS ( SELECT 1, 2 UNION ALL SELECT 1 ) + SELECT * FROM i; +} {1 {cte "i" returns 2 values for 1 columns}} + +do_catchsql_test 5.6.5 { + WITH i(x) AS ( SELECT 1 UNION ALL SELECT 1, 2 ) + SELECT * FROM i; +} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}} + +do_catchsql_test 5.6.6 { + WITH i(x) AS ( SELECT 1 UNION ALL SELECT x+1, x*2 FROM i ) + SELECT * FROM i; +} {1 {SELECTs to the left and right of UNION ALL do not have the same number of result columns}} + +do_catchsql_test 5.6.7 { + WITH i(x) AS ( SELECT 1, 2 UNION SELECT x+1 FROM i ) + SELECT * FROM i; +} {1 {cte "i" returns 2 values for 1 columns}} + #------------------------------------------------------------------------- # do_execsql_test 6.1 {