]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
When generating the name of a view (or common table expression) because the
authordrh <drh@noemail.net>
Fri, 3 Jan 2020 02:20:37 +0000 (02:20 +0000)
committerdrh <drh@noemail.net>
Fri, 3 Jan 2020 02:20:37 +0000 (02:20 +0000)
SQL does not specify a name, avoid the names "true" and "false" which might
be confused for the boolean literals of the same name, leading to an
inconsistent abstract syntax tree.

FossilOrigin-Name: ff9492d3ff733c222ea67f23d478df1547641b5e2e6dd870b0b29e25c13f3739

manifest
manifest.uuid
src/expr.c
src/select.c
src/sqliteInt.h
test/with1.test

index 4440d9e596f34529db89b7d3bc5cd957648dd1bf..250def6b1d718f33c02fb895bfcfe383453381a5 100644 (file)
--- a/manifest
+++ b/manifest
@@ -1,5 +1,5 @@
-C Fix\sa\sproblem\sin\ssqlite3TreeViewBareExprList()\sin\swhich\sthe\sroutine\swas\nnot\sinterpreting\sthe\snew\sExprList\sformat\scorrectly.
-D 2020-01-03T00:28:14.306
+C When\sgenerating\sthe\sname\sof\sa\sview\s(or\scommon\stable\sexpression)\sbecause\sthe\nSQL\sdoes\snot\sspecify\sa\sname,\savoid\sthe\snames\s"true"\sand\s"false"\swhich\smight\nbe\sconfused\sfor\sthe\sboolean\sliterals\sof\sthe\ssame\sname,\sleading\sto\san\ninconsistent\sabstract\ssyntax\stree.
+D 2020-01-03T02:20:37.589
 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
 F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@ -480,7 +480,7 @@ F src/date.c e1d8ac7102f3f283e63e13867acb0efa33861cf34f0faf4cdbaf9fa7a1eb7041
 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7
 F src/dbstat.c 6c407e549406c10fde9ac3987f6d734459205239ad370369bc5fcd683084a4fa
 F src/delete.c a5c59b9c0251cf7682bc52af0d64f09b1aefc6781a63592c8f1136f7b73c66e4
-F src/expr.c bef2f4c18a90fec59575dba1e32cc7d120af4120105bf503b843507f03f1d378
+F src/expr.c 53106d7ca6a00b8fc91d3ab5338561b02efc9d282525e8101423f9c933dd50f0
 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
 F src/fkey.c 92a248ec0fa4ed8ab60c98d9b188ce173aaf218f32e7737ba77deb2a684f9847
 F src/func.c 259496e4856bd0a3215d16804992f3339f3e8db29f129a5a7285c341488bbe9c
@@ -528,12 +528,12 @@ F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
 F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
 F src/resolve.c 938295261d556dc173e7c4b85c921b565b25c38656b924bdf03c3ff8f37e24ab
 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
-F src/select.c 8791103f21df458fdaba16c7d6452f92b00363f222f0f242661654f12455ea0a
+F src/select.c 6a2d755e068b36678317654c953ffaafc4a6282ebb1f67b217a8e960d58992b7
 F src/shell.c.in 90b002bf0054399cbbfac62dd752a9b05770427ba141bcba75eefbb0098f4280
 F src/sqlite.h.in 51f69c62ba3e980aca1e39badcaf9ad13f008774fe1bb8e7f57e3e456c656670
 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
 F src/sqlite3ext.h 72af51aa4e912e14cd495fb6e7fac65f0940db80ed950d90911aff292cc47ce2
-F src/sqliteInt.h 7f028954dc3602b5505064b1028ac671965bfd9905316767cb3298f945478ac0
+F src/sqliteInt.h a694b38db1748007390cbafcaba56d5379203c23ab5ae7d3a538f367e8638102
 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
 F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278
 F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
@@ -1733,7 +1733,7 @@ F test/windowB.test 7a983ea1cc1cf72be7f378e4b32f6cb2d73014c5cd8b25aaee825164cd42
 F test/windowerr.tcl f5acd6fbc210d7b5546c0e879d157888455cd4a17a1d3f28f07c1c8a387019e0
 F test/windowerr.test a8b752402109c15aa1c5efe1b93ccb0ce1ef84fa964ae1cd6684dd0b3cc1819b
 F test/windowfault.test 8e3b69abe0eea9595ba3940afd9c63644e11966ed8815734b67f1479a8e9891a
-F test/with1.test d32792084dcb5f6c047d77bb8a032822ef9fe050ade07d0aeffa37753a05e3c9
+F test/with1.test 386d1c1763a9d369fd08ea03145869b6313ba263e1a102df5a275007000d1b47
 F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab
 F test/with3.test 7de8dff2891aca0f9453463e4a2d6eb995baf137827d5596116fee53e22a4e29
 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205
@@ -1853,7 +1853,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 51665bf0f975fb248964a4be205a4f3285d3f3f8cc697977d264efefbbe20dd8
-R 8459c9056b34d50995b431eb3c997586
+P cd56872afbb4edeff2e8c1cb1c8d47c7a9b333b3fc416c20183250807291fae8
+R 2d4c4407cbf30d2c83e3f90fdf5f6138
 U drh
-Z 2198282fcf120035e4a8ba3edeb717df
+Z df9525e36468611f3a07620ddc0d95cd
index aa6783ac273852e22f78526f9ec93095e2097b2e..b76c6735788a83b9d84ea8f47da72f599d0a8a57 100644 (file)
@@ -1 +1 @@
-cd56872afbb4edeff2e8c1cb1c8d47c7a9b333b3fc416c20183250807291fae8
\ No newline at end of file
+ff9492d3ff733c222ea67f23d478df1547641b5e2e6dd870b0b29e25c13f3739
\ No newline at end of file
index 2d9854c89590d7cb4022bacc5fc3af63773ca764..cc795c09f0b561273775d00ff49ce1ea4238ff58 100644 (file)
@@ -1848,19 +1848,34 @@ int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){
   return WRC_Abort;
 }
 
+/*
+** Check the input string to see if it is "true" or "false" (in any case).
+**
+**       If the string is....           Return
+**         "true"                         EP_IsTrue
+**         "false"                        EP_IsFalse
+**         anything else                  0
+*/
+u32 sqlite3IsTrueOrFalse(const char *zIn){
+  if( sqlite3StrICmp(zIn, "true")==0  ) return EP_IsTrue;
+  if( sqlite3StrICmp(zIn, "false")==0 ) return EP_IsFalse;
+  return 0;
+}
+
+
 /*
 ** If the input expression is an ID with the name "true" or "false"
 ** then convert it into an TK_TRUEFALSE term.  Return non-zero if
 ** the conversion happened, and zero if the expression is unaltered.
 */
 int sqlite3ExprIdToTrueFalse(Expr *pExpr){
+  u32 v;
   assert( pExpr->op==TK_ID || pExpr->op==TK_STRING );
   if( !ExprHasProperty(pExpr, EP_Quoted)
-   && (sqlite3StrICmp(pExpr->u.zToken, "true")==0
-       || sqlite3StrICmp(pExpr->u.zToken, "false")==0)
+   && (v = sqlite3IsTrueOrFalse(pExpr->u.zToken))!=0
   ){
     pExpr->op = TK_TRUEFALSE;
-    ExprSetProperty(pExpr, pExpr->u.zToken[4]==0 ? EP_IsTrue : EP_IsFalse);
+    ExprSetProperty(pExpr, v);
     return 1;
   }
   return 0;
index 63d76a46794203d219d581ff523c231e1bbb480b..df8daef99335b2089d9f3695bd0645192d92de93 100644 (file)
@@ -2003,7 +2003,7 @@ int sqlite3ColumnsFromExprList(
         zName = pEList->a[i].zEName;
       }
     }
-    if( zName ){
+    if( zName && !sqlite3IsTrueOrFalse(zName) ){
       zName = sqlite3DbStrDup(db, zName);
     }else{
       zName = sqlite3MPrintf(db,"column%d",i+1);
index d936b2c30dd7649ddcaf80e923a810736426080f..bab9fba4ada8a120b13adcfd36263f632555ca96 100644 (file)
@@ -4249,6 +4249,7 @@ void sqlite3EndTransaction(Parse*,int);
 void sqlite3Savepoint(Parse*, int, Token*);
 void sqlite3CloseSavepoints(sqlite3 *);
 void sqlite3LeaveMutexAndCloseZombie(sqlite3*);
+u32 sqlite3IsTrueOrFalse(const char*);
 int sqlite3ExprIdToTrueFalse(Expr*);
 int sqlite3ExprTruthValue(const Expr*);
 int sqlite3ExprIsConstant(Expr*);
index 5631bfb69d44b21a255389a930ed5665e80014be..f798dd211160da37c1352a4d52b48285f6e89615 100644 (file)
@@ -1140,4 +1140,28 @@ do_execsql_test 24.2 {
   3 1 1 3
 }
 
+# 2020-01-02 chromium ticket 1033461
+# Do not allow the generated name of a CTE be "true" or "false" as
+# such a label might be later confused for the boolean literals of
+# the same name, causing inconsistencies in the abstract syntax
+# tree.  This problem first arose in version 3.23.0 when SQLite
+# began recognizing "true" and "false" as boolean literals, but also
+# had to continue to recognize "true" and "false" as identifiers for
+# backwards compatibility.
+#
+reset_db
+do_execsql_test 25.1 {
+  CREATE TABLE dual(dummy);
+  INSERT INTO dual(dummy) VALUES('X');
+  WITH cte1 AS (
+    SELECT TRUE, (
+      WITH cte2 AS (SELECT avg(DISTINCT TRUE) FROM dual)
+      SELECT 2571 FROM cte2
+    ) AS subquery1
+    FROM dual
+    GROUP BY 1
+  )
+  SELECT (SELECT 1324 FROM cte1) FROM cte1;
+} {1324}
+
 finish_test