From: dan Date: Fri, 20 Mar 2026 11:35:15 +0000 (+0000) Subject: Ensure that collation sequences on non-PK columns of a WITHOUT ROWID table are used... X-Git-Tag: major-release~67 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bd580270a5b0f032026f5c2b850b62e41db99d63;p=thirdparty%2Fsqlite.git Ensure that collation sequences on non-PK columns of a WITHOUT ROWID table are used correctly when they are part of a row value comparison. Fix for forum post [forum:7a308e933d | 7a308e933d]. FossilOrigin-Name: 078b3162d0d3d3035f4d3ad88664066d99c218a731ac481b9f1172529e26e4eb --- diff --git a/manifest b/manifest index 0035f5d395..f0c2d5b0ac 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Ensure\sthat\ssqlite3RCStr\svalues\sreturned\sby\sjson_group_array()\sand\njson_group_object()\sare\szero-terminated. -D 2026-03-19T23:49:29.059 +C Ensure\sthat\scollation\ssequences\son\snon-PK\scolumns\sof\sa\sWITHOUT\sROWID\stable\sare\sused\scorrectly\swhen\sthey\sare\spart\sof\sa\srow\svalue\scomparison.\sFix\sfor\sforum\spost\s[forum:7a308e933d\s|\s7a308e933d]. +D 2026-03-20T11:35:15.730 F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea @@ -676,7 +676,7 @@ F src/btmutex.c 30dada73a819a1ef5b7583786370dce1842e12e1ad941e4d05ac29695528daea F src/btree.c fb350c445316c1cc0529703c0b76450770a1de0ab0440641a56b19f05d6fefbe F src/btree.h e823c46d87f63d904d735a24b76146d19f51f04445ea561f71cc3382fd1307f0 F src/btreeInt.h 9c0f9ea5c9b5f4dcaea18111d43efe95f2ac276cd86d770dce10fd99ccc93886 -F src/build.c b993e4adef4c4cdfd7abf62e2676c467bb1923f25f40c3c7ab2a7bfbace3de7f +F src/build.c b6efb70b142fd0f6a88ec1d9d43b905f2e38a59973c6f0e329e5cbe376a7f035 F src/callback.c 3605bbf02bd7ed46c79cd48346db4a32fc51d67624400539c0532f4eead804ad F src/carray.c 3efe3982d5fb323334c29328a4e189ccaef6b95612a6084ad5fa124fd5db1179 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e @@ -1561,7 +1561,7 @@ F test/rowvalue6.test d19b54feb604d5601f8614b15e214e0774c01087 F test/rowvalue7.test 06ec0aca725bf683313d03793aa2943bc7f45a901848c7056a9665b769c8fc38 F test/rowvalue8.test 5900eddad9e2c3c2e26f1a95f74aafc1232ee5e0 F test/rowvalue9.test 7499a8fd7ca3a3f0e19d94e135355439aa2b596f86b775ca8de79672da2ca378 -F test/rowvalueA.test 1c5ed13f3b0641452ae35e6488d6ecc16cefce99f2adf7c07c513530e2aac6b7 +F test/rowvalueA.test 7d28bf6c2f8a2af8adbba2c4eda9136a4dd36250b8966ba05b34c0954f78efd7 F test/rowvaluefault.test 963ae9cdaed30a85a29668dd514e639f3556cae903ee9f172ea972d511c54fff F test/rowvaluevtab.test cd9747bb3f308086944c07968f547ad6b05022e698d80b9ffbdfe09ce0b8da6f F test/rtree.test 0c8d9dd458d6824e59683c19ab2ffa9ef946f798 @@ -2195,8 +2195,8 @@ F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee F tool/warnings.sh a554d13f6e5cf3760f041b87939e3d616ec6961859c3245e8ef701d1eafc2ca2 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f F tool/winmain.c 00c8fb88e365c9017db14c73d3c78af62194d9644feaf60e220ab0f411f3604c -P 539769b63e4044018be2993894b1962df6a6ae58636682b7fb7a2dd5aaf4075c -R f204b1ed3a5a1166ad1c711925746777 -U drh -Z 739be31dd461ba606b382c9fb3f1b390 +P 88a931ea2ae734478928c2a6021b00b0f2be490328260630e176cf3cc7111472 +R 3a8ae62427f2beb0c4936f72e745b41a +U dan +Z 3025019227a8a6014385337b8f60a744 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 37456c0a13..6dd2987495 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -88a931ea2ae734478928c2a6021b00b0f2be490328260630e176cf3cc7111472 +078b3162d0d3d3035f4d3ad88664066d99c218a731ac481b9f1172529e26e4eb diff --git a/src/build.c b/src/build.c index c451941451..e357976200 100644 --- a/src/build.c +++ b/src/build.c @@ -2494,9 +2494,10 @@ static void convertToWithoutRowidTable(Parse *pParse, Table *pTab){ if( !hasColumn(pPk->aiColumn, j, i) && (pTab->aCol[i].colFlags & COLFLAG_VIRTUAL)==0 ){ + const char *zColl = sqlite3ColumnColl(&pTab->aCol[i]); assert( jnColumn ); pPk->aiColumn[j] = i; - pPk->azColl[j] = sqlite3StrBINARY; + pPk->azColl[j] = zColl ? zColl : sqlite3StrBINARY; j++; } } diff --git a/test/rowvalueA.test b/test/rowvalueA.test index 16429f985a..247b7bf88c 100644 --- a/test/rowvalueA.test +++ b/test/rowvalueA.test @@ -96,6 +96,30 @@ do_execsql_test 3.3 { SELECT * FROM x2 CROSS JOIN x1 WHERE (1234, x2.y) > (x1.a, x1.b); } {1234 abc 1234 ABCD} +#------------------------------------------------------------------------- +# Test the fix for forum post https://sqlite.org/forum/forumpost/7a308e933d +# +do_execsql_test 4.0 { + CREATE TABLE t1 (a PRIMARY KEY, b COLLATE NOCASE) WITHOUT ROWID; + INSERT INTO t1 VALUES ('BBB', 'a'); +} +do_execsql_test 4.1 { + SELECT * FROM t1 WHERE (t1.a, t1.b) <= ('BBB', 'CCC'); +} {BBB a} + +do_execsql_test 4.2 { + DROP TABLE t1; + CREATE TABLE t0 (c0); + INSERT INTO t0 VALUES ('True'); + + CREATE TABLE t1 (c0 COLLATE NOCASE, c1 PRIMARY KEY) WITHOUT ROWID; + INSERT INTO t1 VALUES ('a', 1); + INSERT INTO t1 VALUES ('a', 'True'); +} + +do_execsql_test 4.3 { + SELECT * FROM t0, t1 WHERE (t1.c1, t1.c0) <= (t0.c0, t0.c0); +} {True a 1 True a True} finish_test