From: dan Date: Tue, 17 May 2022 15:01:01 +0000 (+0000) Subject: Avoid treating constant expressions like "? IN ()" or "? NOT IN ()" as integers if... X-Git-Tag: version-3.39.0~134 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=5348fbe3322570f9fb3b1376cc8f7d25d74e3be3;p=thirdparty%2Fsqlite.git Avoid treating constant expressions like "? IN ()" or "? NOT IN ()" as integers if they appear in a GROUP BY or ORDER BY clause. FossilOrigin-Name: d8b249e8cdf0babe1427d0587dbdc27a52ec06a5ef3a20dfb05a0ea4adb85858 --- diff --git a/manifest b/manifest index 0d33f28d54..e73180ebad 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Add\sthe\ssqlite3_db_name()\sinterface. -D 2022-05-17T14:59:05.338 +C Avoid\streating\sconstant\sexpressions\slike\s"?\sIN\s()"\sor\s"?\sNOT\sIN\s()"\sas\sintegers\sif\sthey\sappear\sin\sa\sGROUP\sBY\sor\sORDER\sBY\sclause. +D 2022-05-17T15:01:01.127 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -542,7 +542,7 @@ F src/os_win.c a8ea80037e81127ca01959daa87387cc135f325c88dc745376c4f760de852a10 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 42120492784fc9bcd9082b5c9b5e329b7318c357f9f3574a1bbfcf7418910356 F src/pager.h f82e9844166e1585f5786837ddc7709966138ced17f568c16af7ccf946c2baa3 -F src/parse.y efcb41d403be7bcecd6a95e51f73f89043e768cd0650a392c9b7ee0edbf1cc67 +F src/parse.y ad9a59d0078267e5aea4cf62f244c0ce6fcec9a91edd365e929c75d3a1716563 F src/pcache.c 084e638432c610f95aea72b8509f0845d2791293f39d1b82f0c0a7e089c3bb6b F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 54881292a9a5db202b2c0ac541c5e3ef9a5e8c4f1c1383adb2601d5499a60e65 @@ -1089,7 +1089,7 @@ F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 F test/icu.test 716a6b89fbabe5cc63e0cd4c260befb08fd7b9d761f04d43669233292f0753b1 F test/ieee754.test b0945d12be7d255f3dfa18e2511b17ca37e0edd2b803231c52d05b86c04ab26e F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test 15de58ee017f43d36390812e9a51217d1b2db7758f97d0df48296ef178ea560b +F test/in.test 55503d3633c434120d8b2d5966a34f0d9a55393a589050b1366afe4b188093c7 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in4.test fdd1d8134da8376985c2edba6035a2de1f6c731524d2ffa651419e8fe2cd1c5a @@ -1954,8 +1954,8 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 9260f4e0fdc8066b4772999bacb5f4130ef714d4ac1967029ceacff618bc48ff -R d21e2300c9b9f847363079df1fcdef69 -U drh -Z 456d2006914746a322619f144cfb48fc +P 2ad152236c408cbb1f942b221de4bf3cbaa9c35313d7eb07a63f46b6040fc981 +R 43491feb68bb986ef951c6ac394e5e71 +U dan +Z 4bd491f85f12c206c1579a88f589c75a # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index e411b5aaea..d58fe49873 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -2ad152236c408cbb1f942b221de4bf3cbaa9c35313d7eb07a63f46b6040fc981 \ No newline at end of file +d8b249e8cdf0babe1427d0587dbdc27a52ec06a5ef3a20dfb05a0ea4adb85858 \ No newline at end of file diff --git a/src/parse.y b/src/parse.y index 565130a05c..fb3c3f38cd 100644 --- a/src/parse.y +++ b/src/parse.y @@ -1271,7 +1271,8 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { ** regardless of the value of expr1. */ sqlite3ExprUnmapAndDelete(pParse, A); - A = sqlite3Expr(pParse->db, TK_INTEGER, N ? "1" : "0"); + A = sqlite3Expr(pParse->db, TK_STRING, N ? "true" : "false"); + if( A ) sqlite3ExprIdToTrueFalse(A); }else{ Expr *pRHS = Y->a[0].pExpr; if( Y->nExpr==1 && sqlite3ExprIsConstant(pRHS) && A->op!=TK_VECTOR ){ diff --git a/test/in.test b/test/in.test index b0eb371cb7..7c4cc51878 100644 --- a/test/in.test +++ b/test/in.test @@ -798,4 +798,13 @@ do_execsql_test in-20.1 { SELECT (1 IN (2 IS TRUE)); } {1} +# Forum post: https://sqlite.org/forum/forumpost/5782619992. +# +reset_db +do_execsql_test in-21.1 { + CREATE TABLE t0(c0); + SELECT COUNT(*) FROM t0 ORDER BY (t0.c0 IN ()); +} {0} + + finish_test