]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Return an error if a CTE specifies a different number of columns than its SELECT...
authordan <dan@noemail.net>
Wed, 15 Jan 2014 15:27:51 +0000 (15:27 +0000)
committerdan <dan@noemail.net>
Wed, 15 Jan 2014 15:27:51 +0000 (15:27 +0000)
FossilOrigin-Name: 9a514b50e4b01f109fbdb0aabcbfe1ddab129b44

manifest
manifest.uuid
src/select.c
test/with1.test

index c853513dbdc61609cdf861e3975da4be8311b99a..d31455438074f6a0cc5fccde9931250c8cdd1680 100644 (file)
--- 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
index cc099a86d20986424d13c2180c15f38dfe9b2737..2aac3c13b11f03b687af692236a6c08f266a2b8b 100644 (file)
@@ -1 +1 @@
-860aa936634a60d68e3954fc408a96a9260394e0
\ No newline at end of file
+9a514b50e4b01f109fbdb0aabcbfe1ddab129b44
\ No newline at end of file
index 35edcbb03c968b3ebbee4784602a84c4a3bcbaea..34a2297c96c9c93d8554dcdb0c1fe56d8d041f30 100644 (file)
@@ -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 ){
index 480afa8074d5d771f46bcd3c227b2c4f5202ef9f..dd1d5c0ab052b879e5ae1af8481ec60566c21693 100644 (file)
@@ -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 {