diff options
author | drh <drh@noemail.net> | 2020-08-27 18:36:30 +0000 |
---|---|---|
committer | drh <drh@noemail.net> | 2020-08-27 18:36:30 +0000 |
commit | 92e21ef0796e797b831a9f6b2e5edb0bd5c21442 (patch) | |
tree | 73d81d8e1686a1232011cc13736c85ccebb3cb64 | |
parent | 359941bd33705c1f5b1d7ed75528c764711a510a (diff) | |
download | sqlite-92e21ef0796e797b831a9f6b2e5edb0bd5c21442.tar.gz sqlite-92e21ef0796e797b831a9f6b2e5edb0bd5c21442.zip |
Include the original text of the CHECK constraint in the error message for
anonymous CHECK constraints.
FossilOrigin-Name: 5ce34a955bb36d77edc9951cb7ac2ef9c876d7d3ff5852af682f558e248f428c
-rw-r--r-- | manifest | 44 | ||||
-rw-r--r-- | manifest.uuid | 2 | ||||
-rw-r--r-- | src/build.c | 13 | ||||
-rw-r--r-- | src/parse.y | 6 | ||||
-rw-r--r-- | src/sqliteInt.h | 2 | ||||
-rw-r--r-- | test/check.test | 44 | ||||
-rw-r--r-- | test/conflict.test | 2 | ||||
-rw-r--r-- | test/conflict2.test | 2 | ||||
-rw-r--r-- | test/date2.test | 4 | ||||
-rw-r--r-- | test/e_createtable.test | 22 | ||||
-rw-r--r-- | test/fkey2.test | 4 | ||||
-rw-r--r-- | test/func4.test | 46 | ||||
-rw-r--r-- | test/in.test | 2 | ||||
-rw-r--r-- | test/insert4.test | 10 | ||||
-rw-r--r-- | test/istrue.test | 10 | ||||
-rw-r--r-- | test/pager1.test | 2 | ||||
-rw-r--r-- | test/quote.test | 2 | ||||
-rw-r--r-- | test/without_rowid1.test | 2 | ||||
-rw-r--r-- | test/without_rowid3.test | 4 |
19 files changed, 119 insertions, 104 deletions
@@ -1,5 +1,5 @@ -C Apple\sthe\ssame\sfix\sfor\sticket\s[9eda2697f5cc1aba]\sto\stext-to-integer\nconversions\sthat\swas\sdone\sfor\sfloating\spoint\sconversions\sby\ncheck-in\s[1c76f1d8ec0937a2]. -D 2020-08-27T16:28:30.075 +C Include\sthe\soriginal\stext\sof\sthe\sCHECK\sconstraint\sin\sthe\serror\smessage\sfor\nanonymous\sCHECK\sconstraints. +D 2020-08-27T18:36:30.231 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -479,7 +479,7 @@ F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 F src/btree.c 634381c86f363dfd470c9dbe64c07363e746cb9917573f67381c861b1d264d8d F src/btree.h c299ab8b279230de1ef457f298ade9848c7339de6ef88a55beaf62bf0345eb15 F src/btreeInt.h d1f713b2947a054c3532154a4d6b2bb8c4698fb54432f171966bdd06728ab1be -F src/build.c a80bc79f0be20185e2005b74e9a23f8abb8fbb3cc54ed769a21865f79d507d90 +F src/build.c 92b61c2be1e35a619391f17c2d1b108901ad5e4df99becc0b064a934e6ec662a F src/callback.c d0b853dd413255d2e337b34545e54d888ea02f20da5ad0e63585b389624c4a6c F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c e98518d2d3d4029a13c805e07313fb60c877be56db76e90dd5f3af73085d0ce6 @@ -524,7 +524,7 @@ F src/os_win.c a2149ff0a85c1c3f9cc102a46c673ce87e992396ba3411bfb53db66813b32f1d F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a F src/pager.c 3700a1c55427a3d4168ad1f1b8a8b0cb9ace1d107e4506e30a8f1e66d8a1195e F src/pager.h 4bf9b3213a4b2bebbced5eaa8b219cf25d4a82f385d093cd64b7e93e5285f66f -F src/parse.y 5bdb760a29c0b25caf7e80e82210b81cd2ea3066d5199ca29e6eac40b34bc184 +F src/parse.y 2ca57a8383e9cf9e1140706a85a4b357d6c09cfea7ba9098746a28bc8212441a F src/pcache.c 385ff064bca69789d199a98e2169445dc16e4291fa807babd61d4890c3b34177 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c 6596e10baf3d8f84cc1585d226cf1ab26564a5f5caf85a15757a281ff977d51a @@ -540,7 +540,7 @@ F src/shell.c.in d9aae37f76cc45b4ef6e8949979dbd124f9e5031789116c85d1aca396a37a40 F src/sqlite.h.in b91e4a5b9b25eb95260be0bf9716d2bdba0da06b72eb439f41592b226f58881d F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 2d1af80082edffd71c6f96f70ad1ce6a4fb46615ad10291fc77fe0dea9ff0197 -F src/sqliteInt.h 7dd1f3a93e801c90cf108149d041c6cc32d3e9503d66aa415455dae1614b6b53 +F src/sqliteInt.h d8d69318b1ba3906d4860da1cd1c6b3650b81c9595e5bc360c6469a1e54e09e1 F src/sqliteLimit.h d7323ffea5208c6af2734574bae933ca8ed2ab728083caa117c9738581a31657 F src/status.c 4b8bc2a6905163a38b739854a35b826c737333fab5b1f8e03fa7eb9a4799c4c1 F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 @@ -740,7 +740,7 @@ F test/capi3d.test aba917805573a03deed961a21f07a5a84505ad0a616f7e3fc1508844a15bc F test/capi3e.test 3d49c01ef2a1a55f41d73cba2b23b5059ec460fe F test/cast.test 2906ccab6a3ebd147ffa63304b635be903ce58264110d0a0eb4fd9939422bb53 F test/cffault.test 9d6b20606afe712374952eec4f8fd74b1a8097ef -F test/check.test 9776af795bb5d0f197b7f8fe248052e3ca2ed35304d863efcdbf8b1316e11f65 +F test/check.test 4a2a91ed67eee84a6be16057c48d5198b6fb24849cd6da6cd855981de3fbb416 F test/checkfault.test da6cb3d50247169efcb20bdf57863a3ccfa1d27d9e55cd324f0680096970f014 F test/chunksize.test 427d87791743486cbf0c3b8c625002f3255cb3a89c6eba655a98923b1387b760 F test/close.test eccbad8ecd611d974cbf47278c3d4e5874faf02d811338d5d348af42d56d647c @@ -759,8 +759,8 @@ F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test 87ad5458bb8709312dac0d6755fd30e8e4ca83298d0a9ef6e5c24277a3c3390e -F test/conflict.test 58857e2533fb9f2e0358ea7cb191215657846be1dd9da3b3d6df3e750c02ae03 -F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c +F test/conflict.test ac0667090f66130ac77d5fb764655558ca6600dd6d88f670ca9123b61c448337 +F test/conflict2.test 5557909ce683b1073982f5d1b61dfb1d41e369533bfdaf003180c5bc87282dd1 F test/conflict3.test 81865d9599609aca394fb3b9cd5f561d4729ea5b176bece3644f6ecb540f88ac F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 F test/corrupt.test d7cb0300e4a297147b6a05e92a1684bc8973635c3bcaa3d66e983c9cbdbf47a3 @@ -807,7 +807,7 @@ F test/cursorhint.test 0175e4404181ace3ceca8b114eb0a98eae600d565aa4e2705abbe6614 F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68ccf2a7bb8 F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 -F test/date2.test 5ef8265c71460cda6b1698bf18f4bb0ffb40ac08c5092f6afe84d398c2feb5be +F test/date2.test 520a1708e4e14c682cf514560f3e9f2e5affa9d66560fbc2a6941ae291260daf F test/dbdata.test 042f49acff3438f940eeba5868d3af080ae64ddf26ae78f80c92bec3ca7d8603 F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e F test/dbfuzz001.test 55e1a3504f8dea84155e09912fe3b1c3ad77e0b1a938ec42ca03b8e51b321e30 @@ -835,7 +835,7 @@ F test/e_blobclose.test 4b3c8c60c2171164d472059c73e9f3c1844bb66d F test/e_blobopen.test e95e1d40f995056f6f322cd5e1a1b83a27e1a145 F test/e_blobwrite.test f87ff598b67af5b3ec002a8d83e804dc8d23808e88cf0080c176612fc9ffce14 F test/e_changes.test fd66105385153dbf21fdb35eb8ef6c3e1eade579 -F test/e_createtable.test ea27082d6f84df61e1d9e383f3fd79220418856a4a8afc41af75d458b8e7ac33 +F test/e_createtable.test 7107f5deda2324ea12dbf105044dc9265195401e9dbb3eead6a2c1a3da4bb5b7 F test/e_delete.test ab39084f26ae1f033c940b70ebdbbd523dc4962e F test/e_droptrigger.test 235c610f8bf8ec44513e222b9085c7e49fad65ad0c1975ac2577109dd06fd8fa F test/e_dropview.test 74e405df7fa0f762e0c9445b166fe03955856532e2bb234c372f7c51228d75e7 @@ -879,7 +879,7 @@ F test/filter2.tcl 44e525497ce07382915f01bd29ffd0fa49dab3adb87253b5e5103ba8f9339 F test/filter2.test 485cf95d1f6d6ceee5632201ca52a71868599836f430cdee42e5f7f14666e30a F test/filterfault.test c08fb491d698e8df6c122c98f7db1c65ffcfcad2c1ab0e07fa8a5be1b34eaa8b F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 -F test/fkey2.test b1b6a8c5556dc0ccf31291b1fed8aa57e404b38f3236110e19ab4dc6aa93edf2 +F test/fkey2.test 1063d65e5923c054cfb8f0555a92a3ae0fa8c067275a33ee1715bd856cdb304c F test/fkey3.test 76d475c80b84ee7a5d062e56ccb6ea68882e2b49 F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d F test/fkey5.test 6727452e163a427147e84e739da18713da553d79f9783559b04fdcd36d5c7421 @@ -1017,7 +1017,7 @@ F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d F test/func.test f673822636fb8ed618dd2b80230d16e495d19c8f2e2e7d6c22e93e2b3de097ad F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f F test/func3.test 2bb0f31ab7baaed690b962a88544d7be6b34fa389364bc36a44e441ed3e3f1e6 -F test/func4.test a94858a8c1f10a408b0b3db439c990b59dbb2349411d503de011ac4e2b5f27a6 +F test/func4.test 2285fb5792d593fef442358763f0fd9de806eda47dbc7a5934df57ffdc484c31 F test/func5.test 863e6d1bd0013d09c17236f8a13ea34008dd857d87d85a13a673960e4c25d82a F test/func6.test 90e42b64c4f9fb6f04f44cb8a1da586c8542502e926b19c76504fe74ff2a9b7c F test/fuzz-oss1.test e58330d01cbbd8215ee636b17a03fe220b37dbfa @@ -1050,7 +1050,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 95a704448eaa348300a517df267b37488c854aa0713125f4fa7b6280cfd4ed0f +F test/in.test 688ed2011d922d83141a45af431601738674a4c0bdde34b6351f688b82a169b3 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in4.test 65460600d48933adba4283c6ebd089aae173d16136ab9d01f74c89089090c5a5 @@ -1084,7 +1084,7 @@ F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 F test/insert.test 4e3f0de67aac3c5be1f4aaedbcea11638f1b5cdc9a3115be14d19aa9db7623c6 F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 -F test/insert4.test fb9e0f752c75f453555990250b449f6d123ae6a3ebf054d14e4470de4498dce3 +F test/insert4.test 59cb99521be01a5aefc9be8e8b5a51ee7f3944781d4d7f6201b9f774fcd51662 F test/insert5.test 394f96728d1258f406fe5f5aeb0aaf29487c39a6 F test/insertfault.test ac63d14ea3b49c573673a572f4014b9117383a03e497c58f308b5c776e4a7f74 F test/instr.test 107df2b9b74a4b59315916b575590a08f2a714de0754abe541f10a0971d0a2a4 @@ -1101,7 +1101,7 @@ F test/ioerr3.test d3cec5e1a11ad6d27527d0d38573fbff14c71bdd F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b -F test/istrue.test 06f92ea38750fa74df7dbbe6920205251c2310861fbbe23a3adfa918a2e2ba74 +F test/istrue.test 9619a2d77580f676048aaff7a16a0bcfea2b96c6c660dfaded2e53c873418899 F test/join.test bca044589e94bb466e4c1e91fb6fecdc3f3326ca6b3f590f555f1958156eb321 F test/join2.test 21fc30e54ab35ed66bf51b89cec18729205497f5cc43c83bc042f96a73721593 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 @@ -1230,7 +1230,7 @@ F test/oserror.test 1fc9746b83d778e70d115049747ba19c7fba154afce7cc165b09feb6ca6a F test/ossfuzz.c 9636dad2092a05a32110df0ca06713038dd0c43dd89a77dabe4b8b0d71096715 F test/ossshell.c f125c5bd16e537a2549aa579b328dd1c59905e7ab1338dfc210e755bb7b69f17 F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f -F test/pager1.test 4fba160bf450cea19f6bf1d6483ef467545bac6405570e176c83c2c4b5d6d0d5 +F test/pager1.test 293c7ad1f19a07e548179b97534c6588249d4e40058b378ea26e75cc84d936f5 F test/pager2.test 67b8f40ae98112bcdba1f2b2d03ea83266418c71 F test/pager3.test 4e9a83d6ca0838d7c602c9eb93d1357562d9059c1e02ffb138a8271020838370 F test/pager4.test a122e9e6925d5b23b31e3dfef8c6a44bbf19590e @@ -1262,7 +1262,7 @@ F test/quick.test 1681febc928d686362d50057c642f77a02c62e57 F test/quota-glob.test 32901e9eed6705d68ca3faee2a06b73b57cb3c26 F test/quota.test bfb269ce81ea52f593f9648316cd5013d766dd2a F test/quota2.test 7dc12e08b11cbc4c16c9ba2aa2e040ea8d8ab4b8 -F test/quote.test 626149eda89ee64d81a3790de370f9f0211921b11568a49c28c861f394330508 +F test/quote.test 3f9238ab0e1db70dea89af9afa5859dbd759b0ce0a63da67d547553e2c316475 F test/randexpr1.tcl 40dec52119ed3a2b8b2a773bce24b63a3a746459 F test/randexpr1.test eda062a97e60f9c38ae8d806b03b0ddf23d796df F test/rbu.test 168573d353cd0fd10196b87b0caa322c144ef736 @@ -1763,9 +1763,9 @@ F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1 F test/with3.test 13b3336739da648a9e4dfa11bb04e73a920c97620041007c5f75d5d14084c346 F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 -F test/without_rowid1.test 9cfb83705c506e3849fa7efc88a3c9a15f9a50bf9b1516b41757a7cef9bba8c3 +F test/without_rowid1.test e4034c0849ccc2e8bb749c69f15bd69bb9fcf8fe77e8d17ce02369604242fe83 F test/without_rowid2.test af260339f79d13cb220288b67cd287fbcf81ad99 -F test/without_rowid3.test 96426a6c9a2a5cf62bbe55ea1ad038eaaf4bf743f40a1ad517233b8e5a3d4339 +F test/without_rowid3.test 39ab0dd773eaa62e59b17093f875327630f54c4145458f6d2b053d68d4b2f67b F test/without_rowid4.test 4e08bcbaee0399f35d58b5581881e7a6243d458a F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a F test/without_rowid6.test 8463b20098e9f75a501a9f17dfb42fffc79068eac0b2775fe56ef2281d2df45e @@ -1879,7 +1879,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 f7f13cb1bc699c034a3f5f7a2431c8055cb79e2a14d5e70e1fc5dd6dec00fb26 -R 8121e5cf7bd833473b2f967ba76c7018 +P aafb7a21041090e529491b0ce30c3902420be0551b1b2c55840a5fbb9105fb7d +R defd5bcc88d7bea7e7e35dc7f6baddf6 U drh -Z 55de9e911e5f0e6470b6e0d616339b8e +Z 54c7264672e91f2f8c6e93ebf30dc6e3 diff --git a/manifest.uuid b/manifest.uuid index 721b77cdc..192459b53 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -aafb7a21041090e529491b0ce30c3902420be0551b1b2c55840a5fbb9105fb7d
\ No newline at end of file +5ce34a955bb36d77edc9951cb7ac2ef9c876d7d3ff5852af682f558e248f428c
\ No newline at end of file diff --git a/src/build.c b/src/build.c index d0086c3c0..1597f8bc3 100644 --- a/src/build.c +++ b/src/build.c @@ -1617,8 +1617,10 @@ primary_key_exit: ** Add a new CHECK constraint to the table currently under construction. */ void sqlite3AddCheckConstraint( - Parse *pParse, /* Parsing context */ - Expr *pCheckExpr /* The check expression */ + Parse *pParse, /* Parsing context */ + Expr *pCheckExpr, /* The check expression */ + const char *zStart, /* Opening "(" */ + const char *zEnd /* Closing ")" */ ){ #ifndef SQLITE_OMIT_CHECK Table *pTab = pParse->pNewTable; @@ -1629,6 +1631,13 @@ void sqlite3AddCheckConstraint( pTab->pCheck = sqlite3ExprListAppend(pParse, pTab->pCheck, pCheckExpr); if( pParse->constraintName.n ){ sqlite3ExprListSetName(pParse, pTab->pCheck, &pParse->constraintName, 1); + }else{ + Token t; + for(zStart++; sqlite3Isspace(zStart[0]); zStart++){} + while( sqlite3Isspace(zEnd[-1]) ){ zEnd--; } + t.z = zStart; + t.n = (int)(zEnd - t.z); + sqlite3ExprListSetName(pParse, pTab->pCheck, &t, 1); } }else #endif diff --git a/src/parse.y b/src/parse.y index 44e0b4f34..c44d6563a 100644 --- a/src/parse.y +++ b/src/parse.y @@ -366,7 +366,7 @@ ccons ::= PRIMARY KEY sortorder(Z) onconf(R) autoinc(I). {sqlite3AddPrimaryKey(pParse,0,R,I,Z);} ccons ::= UNIQUE onconf(R). {sqlite3CreateIndex(pParse,0,0,0,0,R,0,0,0,0, SQLITE_IDXTYPE_UNIQUE);} -ccons ::= CHECK LP expr(X) RP. {sqlite3AddCheckConstraint(pParse,X);} +ccons ::= CHECK LP(A) expr(X) RP(B). {sqlite3AddCheckConstraint(pParse,X,A.z,B.z);} ccons ::= REFERENCES nm(T) eidlist_opt(TA) refargs(R). {sqlite3CreateForeignKey(pParse,0,&T,TA,R);} ccons ::= defer_subclause(D). {sqlite3DeferForeignKey(pParse,D);} @@ -420,8 +420,8 @@ tcons ::= PRIMARY KEY LP sortlist(X) autoinc(I) RP onconf(R). tcons ::= UNIQUE LP sortlist(X) RP onconf(R). {sqlite3CreateIndex(pParse,0,0,0,X,R,0,0,0,0, SQLITE_IDXTYPE_UNIQUE);} -tcons ::= CHECK LP expr(E) RP onconf. - {sqlite3AddCheckConstraint(pParse,E);} +tcons ::= CHECK LP(A) expr(E) RP(B) onconf. + {sqlite3AddCheckConstraint(pParse,E,A.z,B.z);} tcons ::= FOREIGN KEY LP eidlist(FA) RP REFERENCES nm(T) eidlist_opt(TA) refargs(R) defer_subclause_opt(D). { sqlite3CreateForeignKey(pParse, FA, &T, TA, R); diff --git a/src/sqliteInt.h b/src/sqliteInt.h index f2c4f63c0..9afc287a5 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4184,7 +4184,7 @@ void sqlite3StartTable(Parse*,Token*,Token*,int,int,int,int); void sqlite3AddColumn(Parse*,Token*,Token*); void sqlite3AddNotNull(Parse*, int); void sqlite3AddPrimaryKey(Parse*, ExprList*, int, int, int); -void sqlite3AddCheckConstraint(Parse*, Expr*); +void sqlite3AddCheckConstraint(Parse*, Expr*, const char*, const char*); void sqlite3AddDefaultValue(Parse*,Expr*,const char*,const char*); void sqlite3AddCollateType(Parse*, Token*); void sqlite3AddGenerated(Parse*,Expr*,Token*); diff --git a/test/check.test b/test/check.test index d28006e38..94fe1d14e 100644 --- a/test/check.test +++ b/test/check.test @@ -40,7 +40,7 @@ do_test check-1.3 { catchsql { INSERT INTO t1 VALUES(6,7); } -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: x<5}} do_test check-1.4 { execsql { SELECT * FROM t1; @@ -50,7 +50,7 @@ do_test check-1.5 { catchsql { INSERT INTO t1 VALUES(4,3); } -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: y>x}} do_test check-1.6 { execsql { SELECT * FROM t1; @@ -87,7 +87,7 @@ do_test check-1.12 { catchsql { UPDATE t1 SET x=7 WHERE x==2 } -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: x<5}} do_test check-1.13 { execsql { SELECT * FROM t1; @@ -97,7 +97,7 @@ do_test check-1.14 { catchsql { UPDATE t1 SET x=5 WHERE x==2 } -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: x<5}} do_test check-1.15 { execsql { SELECT * FROM t1; @@ -186,7 +186,7 @@ do_test check-2.11 { catchsql { INSERT INTO t2b VALUES('xyzzy','hi',5); } -} {1 {CHECK constraint failed: t2b}} +} {1 {CHECK constraint failed: typeof(coalesce(x,0))=='integer'}} do_test check-2.12 { execsql { CREATE TABLE t2c( @@ -271,7 +271,7 @@ do_test check-3.9 { catchsql { INSERT INTO t3 VALUES(111,222,333); } -} {1 {CHECK constraint failed: t3}} +} {1 {CHECK constraint failed: t3.x<25}} do_test check-4.1 { execsql { @@ -313,7 +313,10 @@ do_test check-4.6 { catchsql { UPDATE t4 SET x=0, y=1; } -} {1 {CHECK constraint failed: t4}} +} {1 {CHECK constraint failed: x+y==11 + OR x*y==12 + OR x/y BETWEEN 5 AND 8 + OR -x==y+10}} do_test check-4.7 { execsql { SELECT * FROM t4; @@ -335,7 +338,10 @@ do_test check-4.9 { catchsql { UPDATE t4 SET x=0, y=2; } -} {1 {CHECK constraint failed: t4}} +} {1 {CHECK constraint failed: x+y==11 + OR x*y==12 + OR x/y BETWEEN 5 AND 8 + OR -x==y+10}} ifcapable vacuum { do_test check_4.10 { catchsql { @@ -386,7 +392,7 @@ do_test check-6.5 { catchsql { UPDATE OR FAIL t1 SET x=7-x, y=y+1; } -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: x<5}} do_test check-6.6 { execsql { SELECT * FROM t1; @@ -398,7 +404,7 @@ do_test check-6.7 { INSERT INTO t1 VALUES(1,30.0); INSERT OR ROLLBACK INTO t1 VALUES(8,40.0); } -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: x<5}} do_test check-6.8 { catchsql { COMMIT; @@ -417,7 +423,7 @@ do_test check-6.12 { catchsql { REPLACE INTO t1 VALUES(6,7); } -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: x<5}} do_test check-6.13 { execsql {SELECT * FROM t1} } {3 12.0 2 20.0} @@ -446,7 +452,7 @@ db func myfunc -deterministic myfunc do_execsql_test 7.1 { CREATE TABLE t6(a CHECK (myfunc(a))) } do_execsql_test 7.2 { INSERT INTO t6 VALUES(9) } do_catchsql_test 7.3 { INSERT INTO t6 VALUES(11) } \ - {1 {CHECK constraint failed: t6}} + {1 {CHECK constraint failed: myfunc(a)}} do_test 7.4 { sqlite3 db2 test.db @@ -469,7 +475,7 @@ do_test 7.7 { do_test 7.8 { db2 func myfunc myfunc catchsql { INSERT INTO t6 VALUES(12) } db2 -} {1 {CHECK constraint failed: t6}} +} {1 {CHECK constraint failed: myfunc(a)}} # 2013-08-02: Silently ignore database name qualifiers in CHECK constraints. # @@ -550,10 +556,10 @@ do_execsql_test 12.20 { } {} do_catchsql_test 12.21 { INSERT INTO t1(a) VALUES('xyz'); -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: a<>+a}} do_catchsql_test 12.22 { INSERT INTO t1(a) VALUES(123); -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: a<>+a}} do_execsql_test 12.30 { DROP TABLE t1; CREATE TABLE t1(a TEXT, CHECK(NOT(a=+a))); @@ -561,10 +567,10 @@ do_execsql_test 12.30 { } {} do_catchsql_test 12.31 { INSERT INTO t1(a) VALUES('xyz'); -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: NOT(a=+a)}} do_catchsql_test 12.32 { INSERT INTO t1(a) VALUES(123); -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: NOT(a=+a)}} do_execsql_test 12.40 { DROP TABLE t1; CREATE TABLE t1(a TEXT, CHECK(NOT(a<>+a))); @@ -585,7 +591,7 @@ do_execsql_test 12.60 { } {NULL} do_catchsql_test 12.61 { INSERT INTO t1(a) VALUES(456); -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: a NOT BETWEEN 0 AND +a}} do_execsql_test 12.70 { DROP TABLE t1; CREATE TABLE t1(a TEXT, CHECK(a BETWEEN +a AND 999999)); @@ -600,6 +606,6 @@ do_execsql_test 12.80 { } {NULL} do_catchsql_test 12.81 { INSERT INTO t1(a) VALUES(456); -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: a NOT BETWEEN +a AND 999999}} finish_test diff --git a/test/conflict.test b/test/conflict.test index b86f86022..e0d0c87ec 100644 --- a/test/conflict.test +++ b/test/conflict.test @@ -813,7 +813,7 @@ do_test conflict-13.1 { catchsql { REPLACE INTO t13 VALUES(2); } -} {1 {CHECK constraint failed: t13}} +} {1 {CHECK constraint failed: a!=2}} verify_ex_errcode conflict-13.1b SQLITE_CONSTRAINT_CHECK do_test conflict-13.2 { execsql { diff --git a/test/conflict2.test b/test/conflict2.test index f33e01d58..96289d38c 100644 --- a/test/conflict2.test +++ b/test/conflict2.test @@ -811,7 +811,7 @@ do_test conflict2-13.1 { catchsql { REPLACE INTO t13 VALUES(2); } -} {1 {CHECK constraint failed: t13}} +} {1 {CHECK constraint failed: a!=2}} verify_ex_errcode conflict2-13.1b SQLITE_CONSTRAINT_CHECK do_test conflict2-13.2 { execsql { diff --git a/test/date2.test b/test/date2.test index 820420ccf..30a475737 100644 --- a/test/date2.test +++ b/test/date2.test @@ -36,7 +36,7 @@ do_execsql_test date2-120 { } {2017-07-20 one} do_catchsql_test date2-130 { INSERT INTO t1(x,y) VALUES('2017-08-01','two'); -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: date(x) BETWEEN '2017-07-01' AND '2017-07-31'}} do_execsql_test date2-200 { CREATE TABLE t2(x,y); @@ -138,7 +138,7 @@ do_catchsql_test date2-601 { } {0 {}} do_catchsql_test date2-602 { INSERT INTO t601(a,b) VALUES(1e100, '1970-01-01'); -} {1 {CHECK constraint failed: t601}} +} {1 {CHECK constraint failed: a<julianday(b)}} do_catchsql_test date2-603 { INSERT INTO t601(a,b) VALUES(10, 'now'); } {1 {non-deterministic use of julianday() in a CHECK constraint}} diff --git a/test/e_createtable.test b/test/e_createtable.test index c9742eaee..e83e5cca1 100644 --- a/test/e_createtable.test +++ b/test/e_createtable.test @@ -1433,20 +1433,20 @@ do_execsql_test 4.11 { } do_createtable_tests 4.11 -error {CHECK constraint failed: %s} { - 1a "INSERT INTO x1 VALUES('one', 0)" {x1} - 1b "INSERT INTO t1 VALUES('one', -4.0)" {t1} + 1a "INSERT INTO x1 VALUES('one', 0)" {b>0} + 1b "INSERT INTO t1 VALUES('one', -4.0)" {b>0} - 2a "INSERT INTO x2 VALUES('abc', 1)" {x2} - 2b "INSERT INTO t2 VALUES('abc', 1)" {t2} + 2a "INSERT INTO x2 VALUES('abc', 1)" {a||b} + 2b "INSERT INTO t2 VALUES('abc', 1)" {a||b} - 3a "INSERT INTO x2 VALUES(0, 'abc')" {x2} - 3b "INSERT INTO t2 VALUES(0, 'abc')" {t2} + 3a "INSERT INTO x2 VALUES(0, 'abc')" {a||b} + 3b "INSERT INTO t2 VALUES(0, 'abc')" {a||b} - 4a "UPDATE t1 SET b=-1 WHERE rowid=1" {t1} - 4b "UPDATE x1 SET b=-1 WHERE rowid=1" {x1} + 4a "UPDATE t1 SET b=-1 WHERE rowid=1" {b>0} + 4b "UPDATE x1 SET b=-1 WHERE rowid=1" {b>0} - 4a "UPDATE x2 SET a='' WHERE rowid=1" {x2} - 4b "UPDATE t2 SET a='' WHERE rowid=1" {t2} + 4a "UPDATE x2 SET a='' WHERE rowid=1" {a||b} + 4b "UPDATE t2 SET a='' WHERE rowid=1" {a||b} } # EVIDENCE-OF: R-34109-39108 If the CHECK expression evaluates to NULL, @@ -1639,7 +1639,7 @@ do_execsql_test 4.18.1 { do_execsql_test 4.18.2 { BEGIN; INSERT INTO t4 VALUES(5, 6) } do_catchsql_test 4.18.3 { INSERT INTO t4 SELECT a+4, b+4 FROM t4 -} {1 {CHECK constraint failed: t4}} +} {1 {CHECK constraint failed: b!=10}} do_test e_createtable-4.18.4 { sqlite3_get_autocommit db } 0 do_execsql_test 4.18.5 { SELECT * FROM t4 } {1 2 3 4 5 6} diff --git a/test/fkey2.test b/test/fkey2.test index 015c43cbd..6f9bdc2b7 100644 --- a/test/fkey2.test +++ b/test/fkey2.test @@ -417,14 +417,14 @@ do_test fkey2-3.1.2 { } {} do_test fkey2-3.1.3 { catchsql { UPDATE ab SET a = 5 } -} {1 {CHECK constraint failed: ef}} +} {1 {CHECK constraint failed: e!=5}} do_test fkey2-3.1.4 { execsql { SELECT * FROM ab } } {1 b} do_test fkey2-3.1.4 { execsql BEGIN; catchsql { UPDATE ab SET a = 5 } -} {1 {CHECK constraint failed: ef}} +} {1 {CHECK constraint failed: e!=5}} do_test fkey2-3.1.5 { execsql COMMIT; execsql { SELECT * FROM ab; SELECT * FROM cd; SELECT * FROM ef } diff --git a/test/func4.test b/test/func4.test index fe7d042c2..924c1fa53 100644 --- a/test/func4.test +++ b/test/func4.test @@ -381,32 +381,32 @@ ifcapable check { catchsql { INSERT INTO t1 (x) VALUES (NULL); } - } {1 {CHECK constraint failed: t1}} + } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.3 { catchsql { INSERT INTO t1 (x) VALUES (NULL); } - } {1 {CHECK constraint failed: t1}} + } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.4 { catchsql { INSERT INTO t1 (x) VALUES (''); } - } {1 {CHECK constraint failed: t1}} + } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.5 { catchsql { INSERT INTO t1 (x) VALUES ('bad'); } - } {1 {CHECK constraint failed: t1}} + } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.6 { catchsql { INSERT INTO t1 (x) VALUES ('1234bad'); } - } {1 {CHECK constraint failed: t1}} + } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.7 { catchsql { INSERT INTO t1 (x) VALUES ('1234.56bad'); } - } {1 {CHECK constraint failed: t1}} + } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.8 { catchsql { INSERT INTO t1 (x) VALUES (1234); @@ -416,7 +416,7 @@ ifcapable check { catchsql { INSERT INTO t1 (x) VALUES (1234.56); } - } {1 {CHECK constraint failed: t1}} + } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.10 { catchsql { INSERT INTO t1 (x) VALUES ('1234'); @@ -426,27 +426,27 @@ ifcapable check { catchsql { INSERT INTO t1 (x) VALUES ('1234.56'); } - } {1 {CHECK constraint failed: t1}} + } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.12 { catchsql { INSERT INTO t1 (x) VALUES (ZEROBLOB(4)); } - } {1 {CHECK constraint failed: t1}} + } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.13 { catchsql { INSERT INTO t1 (x) VALUES (X''); } - } {1 {CHECK constraint failed: t1}} + } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.14 { catchsql { INSERT INTO t1 (x) VALUES (X'1234'); } - } {1 {CHECK constraint failed: t1}} + } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.15 { catchsql { INSERT INTO t1 (x) VALUES (X'12345678'); } - } {1 {CHECK constraint failed: t1}} + } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} do_test func4-3.16 { catchsql { INSERT INTO t1 (x) VALUES ('1234.00'); @@ -467,7 +467,7 @@ ifcapable check { catchsql { INSERT INTO t1 (x) VALUES (9223372036854775808); } - } {1 {CHECK constraint failed: t1}} + } {1 {CHECK constraint failed: tointeger(x) IS NOT NULL}} } do_execsql_test func4-3.20 { SELECT x FROM t1 WHERE x>0 ORDER BY x; @@ -483,32 +483,32 @@ ifcapable check { catchsql { INSERT INTO t2 (x) VALUES (NULL); } - } {1 {CHECK constraint failed: t2}} + } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.3 { catchsql { INSERT INTO t2 (x) VALUES (NULL); } - } {1 {CHECK constraint failed: t2}} + } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.4 { catchsql { INSERT INTO t2 (x) VALUES (''); } - } {1 {CHECK constraint failed: t2}} + } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.5 { catchsql { INSERT INTO t2 (x) VALUES ('bad'); } - } {1 {CHECK constraint failed: t2}} + } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.6 { catchsql { INSERT INTO t2 (x) VALUES ('1234bad'); } - } {1 {CHECK constraint failed: t2}} + } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.7 { catchsql { INSERT INTO t2 (x) VALUES ('1234.56bad'); } - } {1 {CHECK constraint failed: t2}} + } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.8 { catchsql { INSERT INTO t2 (x) VALUES (1234); @@ -533,22 +533,22 @@ ifcapable check { catchsql { INSERT INTO t2 (x) VALUES (ZEROBLOB(4)); } - } {1 {CHECK constraint failed: t2}} + } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.13 { catchsql { INSERT INTO t2 (x) VALUES (X''); } - } {1 {CHECK constraint failed: t2}} + } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.14 { catchsql { INSERT INTO t2 (x) VALUES (X'1234'); } - } {1 {CHECK constraint failed: t2}} + } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_test func4-4.15 { catchsql { INSERT INTO t2 (x) VALUES (X'12345678'); } - } {1 {CHECK constraint failed: t2}} + } {1 {CHECK constraint failed: toreal(x) IS NOT NULL}} do_execsql_test func4-4.16 { SELECT x FROM t2 ORDER BY x; } {1234.0 1234.0 1234.56 1234.56} diff --git a/test/in.test b/test/in.test index f09c52f9f..efbfbd037 100644 --- a/test/in.test +++ b/test/in.test @@ -332,7 +332,7 @@ do_test in-10.2 { catchsql { INSERT INTO t5 VALUES(4); } -} {1 {CHECK constraint failed: t5}} +} {1 {CHECK constraint failed: a IN (111,222,333)}} # Ticket #1821 # diff --git a/test/insert4.test b/test/insert4.test index 4c6a6d4a6..3eca60a84 100644 --- a/test/insert4.test +++ b/test/insert4.test @@ -55,7 +55,7 @@ do_test insert4-1.1 { catchsql { INSERT INTO t1 SELECT * FROM t2; } -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: b>a}} xferopt_test insert4-1.2 0 do_test insert4-1.3 { execsql { @@ -102,7 +102,7 @@ do_test insert4-2.3.3 { INSERT INTO t1 SELECT * FROM t2 LIMIT 1; SELECT * FROM t1; } -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: b>a}} xferopt_test insert4-2.3.4 0 # Do not run the transfer optimization if there is a DISTINCT @@ -120,7 +120,7 @@ do_test insert4-2.4.3 { DELETE FROM t1; INSERT INTO t1 SELECT DISTINCT * FROM t2; } -} {1 {CHECK constraint failed: t1}} +} {1 {CHECK constraint failed: b>a}} xferopt_test insert4-2.4.4 0 # The following procedure constructs two tables then tries to transfer @@ -316,7 +316,7 @@ do_test insert4-6.6 { catchsql { INSERT INTO t6b SELECT * FROM t6a; } -} {1 {CHECK constraint failed: t6b}} +} {1 {CHECK constraint failed: x<>'abc' COLLATE nocase}} do_test insert4-6.7 { execsql { DROP TABLE t6b; @@ -325,7 +325,7 @@ do_test insert4-6.7 { catchsql { INSERT INTO t6b SELECT * FROM t6a; } -} {1 {CHECK constraint failed: t6b}} +} {1 {CHECK constraint failed: x COLLATE nocase <>'abc'}} # Ticket [6284df89debdfa61db8073e062908af0c9b6118e] # Disable the xfer optimization if the destination table contains diff --git a/test/istrue.test b/test/istrue.test index b2f5b8d22..13eccabc2 100644 --- a/test/istrue.test +++ b/test/istrue.test @@ -112,16 +112,16 @@ do_execsql_test istrue-520 { } {1 1 0 {} {}} do_catchsql_test istrue-521 { INSERT INTO t2 VALUES(2,false,false,null,null); -} {1 {CHECK constraint failed: t2}} +} {1 {CHECK constraint failed: b IS TRUE}} do_catchsql_test istrue-522 { INSERT INTO t2 VALUES(2,true,true,null,null); -} {1 {CHECK constraint failed: t2}} +} {1 {CHECK constraint failed: c IS FALSE}} do_catchsql_test istrue-523 { INSERT INTO t2 VALUES(2,true,false,true,null); -} {1 {CHECK constraint failed: t2}} +} {1 {CHECK constraint failed: d IS NOT TRUE}} do_catchsql_test istrue-524 { INSERT INTO t2 VALUES(2,true,false,null,false); -} {1 {CHECK constraint failed: t2}} +} {1 {CHECK constraint failed: e IS NOT FALSE}} foreach {tn val} [list 1 NaN 2 -NaN 3 NaN0 4 -NaN0 5 Inf 6 -Inf] { do_execsql_test istrue-600.$tn.1 { @@ -193,7 +193,7 @@ do_execsql_test istrue-840 { } {} do_catchsql_test istrue-841 { INSERT INTO False VALUES(5,6,7); -} {1 {CHECK constraint failed: false}} +} {1 {CHECK constraint failed: 5 IN (false.false)}} do_execsql_test istrue-850 { SELECT 9 IN (false.false) FROM false; } {0} diff --git a/test/pager1.test b/test/pager1.test index 20fd8bd17..5c3f7a8ea 100644 --- a/test/pager1.test +++ b/test/pager1.test @@ -276,7 +276,7 @@ do_execsql_test pager1-3.1.2 { } {3 0} do_catchsql_test pager1-3.1.3 { INSERT INTO t1 SELECT a+3, randomblob(1500) FROM t1 -} {1 {CHECK constraint failed: counter}} +} {1 {CHECK constraint failed: i<5}} do_execsql_test pager1-3.4 { SELECT * FROM counter } {3 0} do_execsql_test pager1-3.5 { SELECT a FROM t1 } {1 2 3} do_execsql_test pager1-3.6 { COMMIT } {} diff --git a/test/quote.test b/test/quote.test index a7477087c..553e96a0b 100644 --- a/test/quote.test +++ b/test/quote.test @@ -122,7 +122,7 @@ do_execsql_test 2.3.1 { } do_catchsql_test 2.3.2 { INSERT INTO xyz VALUES(1, 2, 'null'); -} {1 {CHECK constraint failed: xyz}} +} {1 {CHECK constraint failed: c!="null"}} do_execsql_test 2.4 { INSERT INTO t1 VALUES(1, 2, 3); diff --git a/test/without_rowid1.test b/test/without_rowid1.test index 3497ca0cc..02a089610 100644 --- a/test/without_rowid1.test +++ b/test/without_rowid1.test @@ -341,7 +341,7 @@ do_execsql_test 7.1 { } {} do_catchsql_test 7.2 { INSERT INTO t70a(rowid,a,b) VALUES(33,99,'xyzzy'); -} {1 {CHECK constraint failed: t70a}} +} {1 {CHECK constraint failed: rowid!=33}} do_catchsql_test 7.3 { CREATE TABLE t70b( a INT CHECK( rowid!=33 ), diff --git a/test/without_rowid3.test b/test/without_rowid3.test index eae7e3c85..f7687455e 100644 --- a/test/without_rowid3.test +++ b/test/without_rowid3.test @@ -417,14 +417,14 @@ do_test without_rowid3-3.1.2 { } {} do_test without_rowid3-3.1.3 { catchsql { UPDATE ab SET a = 5 } -} {1 {CHECK constraint failed: ef}} +} {1 {CHECK constraint failed: e!=5}} do_test without_rowid3-3.1.4 { execsql { SELECT * FROM ab } } {1 b} do_test without_rowid3-3.1.4 { execsql BEGIN; catchsql { UPDATE ab SET a = 5 } -} {1 {CHECK constraint failed: ef}} +} {1 {CHECK constraint failed: e!=5}} do_test without_rowid3-3.1.5 { execsql COMMIT; execsql { SELECT * FROM ab; SELECT * FROM cd; SELECT * FROM ef } |