mirror of
https://github.com/sqlite/sqlite.git
synced 2025-11-19 21:43:15 +03:00
Merge enhancements from trunk.
FossilOrigin-Name: 4945a66237fa3861bc691d5fbef0d40286b596a0902b4f4c032d1d6528bb1a1b
This commit is contained in:
20
manifest
20
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Merge\supdates\sfrom\strunk.
|
C Merge\senhancements\sfrom\strunk.
|
||||||
D 2020-03-10T22:55:51.353
|
D 2020-03-11T20:03:22.100
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
|
||||||
@@ -483,7 +483,7 @@ F src/date.c 6c408fdd2e9ddf6e8431aba76315a2d061bea2cec8fbb75e25d7c1ba08274712
|
|||||||
F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a
|
F src/dbpage.c 8a01e865bf8bc6d7b1844b4314443a6436c07c3efe1d488ed89e81719047833a
|
||||||
F src/dbstat.c 0f55297469d4244ab7df395849e1af98eb5e95816af7c661e7d2d8402dea23da
|
F src/dbstat.c 0f55297469d4244ab7df395849e1af98eb5e95816af7c661e7d2d8402dea23da
|
||||||
F src/delete.c 11000121c4281c0bce4e41db29addfaea0038eaa127ece02557c9207bc3e541d
|
F src/delete.c 11000121c4281c0bce4e41db29addfaea0038eaa127ece02557c9207bc3e541d
|
||||||
F src/expr.c 117997508b41b1d02b4c376bdca16da04e813c0f36d0811e3ea13d1c786f53f4
|
F src/expr.c ed718ee2206166c9c2fc4fe89eadb1f369318aeb8645e06033566b387970fb9a
|
||||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||||
F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41
|
F src/fkey.c 4b575423b0a5d4898b1a7868ce985cf1a8ad91c741c9abbb108ff02536d20f41
|
||||||
F src/func.c 108577cebe8a50c86d849a93b99493a54e348dd0b846f00d13b52ca973d5baf4
|
F src/func.c 108577cebe8a50c86d849a93b99493a54e348dd0b846f00d13b52ca973d5baf4
|
||||||
@@ -536,7 +536,7 @@ F src/shell.c.in f76590931c0cbbfef347f44f81ade6b335f80c46bc6e59b8b6114383a8df30e
|
|||||||
F src/sqlite.h.in 802957feeb249ede54f8dfe99b72aa19e70a0b7737969c46e625dc2f9f2d42b0
|
F src/sqlite.h.in 802957feeb249ede54f8dfe99b72aa19e70a0b7737969c46e625dc2f9f2d42b0
|
||||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||||
F src/sqlite3ext.h 9c5269260409eb3275324ccace6a13a96f4ad330c708415f70ca6097901ff4ee
|
F src/sqlite3ext.h 9c5269260409eb3275324ccace6a13a96f4ad330c708415f70ca6097901ff4ee
|
||||||
F src/sqliteInt.h ed6885bb0ec82db2503c931fd96c795fc7a4b474dc075c3442a45c3a8523c797
|
F src/sqliteInt.h 5f74c1c52b152259ee07f241821620f11736e4f590936cfaf1cbbff9a2f563d3
|
||||||
F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032
|
F src/sqliteLimit.h 95cb8479ca459496d9c1c6a9f76b38aee12203a56ce1092fe13e50ae2454c032
|
||||||
F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278
|
F src/status.c 9ff2210207c6c3b4d9631a8241a7d45ab1b26a0e9c84cb07a9b5ce2de9a3b278
|
||||||
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
||||||
@@ -603,7 +603,7 @@ F src/upsert.c 2920de71b20f04fe25eb00b655d086f0ba60ea133c59d7fa3325c49838818e78
|
|||||||
F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7
|
F src/utf.c 95fb6e03a5ca679045c5adccd05380f0addccabef5911abddcb06af069500ab7
|
||||||
F src/util.c a285c1e026907b69fa2592bd05047a565a1d8a1aef2b73c924b6a8ffe772871a
|
F src/util.c a285c1e026907b69fa2592bd05047a565a1d8a1aef2b73c924b6a8ffe772871a
|
||||||
F src/vacuum.c 813b510ba887fee6492bcb11f2bf77d7eb58b232b83649136372e0a2fc17f4b9
|
F src/vacuum.c 813b510ba887fee6492bcb11f2bf77d7eb58b232b83649136372e0a2fc17f4b9
|
||||||
F src/vdbe.c 8ad7906cf9aca841b97064fbf62323f53aaf8e4f8251ffa5e152abc5bda806d3
|
F src/vdbe.c 6d0cf7ac2d54f78ff2fb55cbef970199695319c0a95bf862c6561d7d2c9f7134
|
||||||
F src/vdbe.h 51282fbe819ee0e8eeeaab176240860d334c20a12b14f3b363e7f1a4e05d60b9
|
F src/vdbe.h 51282fbe819ee0e8eeeaab176240860d334c20a12b14f3b363e7f1a4e05d60b9
|
||||||
F src/vdbeInt.h a17146053a1aa438474012998fe07e314f3df274a61491ad838ad85d848ac051
|
F src/vdbeInt.h a17146053a1aa438474012998fe07e314f3df274a61491ad838ad85d848ac051
|
||||||
F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02
|
F src/vdbeapi.c 1252d80c548711e47a6d84dae88ed4e95d3fbb4e7bd0eaa1347299af7efddf02
|
||||||
@@ -1003,11 +1003,11 @@ F test/fts4rename.test 15fd9985c2bce6dea20da2245b22029ec89bd4710ed317c4c53abbe3c
|
|||||||
F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429
|
F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429
|
||||||
F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95
|
F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95
|
||||||
F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d
|
F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d
|
||||||
F test/func.test b7f1a706d1bb8de103a24bd0c30c9e3dc3eedf0df24aabc54b0a4f6e08742622
|
F test/func.test f673822636fb8ed618dd2b80230d16e495d19c8f2e2e7d6c22e93e2b3de097ad
|
||||||
F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f
|
F test/func2.test 772d66227e4e6684b86053302e2d74a2500e1e0f
|
||||||
F test/func3.test 2bb0f31ab7baaed690b962a88544d7be6b34fa389364bc36a44e441ed3e3f1e6
|
F test/func3.test 2bb0f31ab7baaed690b962a88544d7be6b34fa389364bc36a44e441ed3e3f1e6
|
||||||
F test/func4.test a94858a8c1f10a408b0b3db439c990b59dbb2349411d503de011ac4e2b5f27a6
|
F test/func4.test a94858a8c1f10a408b0b3db439c990b59dbb2349411d503de011ac4e2b5f27a6
|
||||||
F test/func5.test cdd224400bc3e48d891827cc913a57051a426fa4
|
F test/func5.test 863e6d1bd0013d09c17236f8a13ea34008dd857d87d85a13a673960e4c25d82a
|
||||||
F test/func6.test 90e42b64c4f9fb6f04f44cb8a1da586c8542502e926b19c76504fe74ff2a9b7c
|
F test/func6.test 90e42b64c4f9fb6f04f44cb8a1da586c8542502e926b19c76504fe74ff2a9b7c
|
||||||
F test/fuzz-oss1.test e58330d01cbbd8215ee636b17a03fe220b37dbfa
|
F test/fuzz-oss1.test e58330d01cbbd8215ee636b17a03fe220b37dbfa
|
||||||
F test/fuzz.test 96083052bf5765e4518c1ba686ce2bab785670d1
|
F test/fuzz.test 96083052bf5765e4518c1ba686ce2bab785670d1
|
||||||
@@ -1860,7 +1860,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P 29d1cc5c3619a88229f18c3c8131228f8a2d151ac3d9203f0c7fc538a996ecec 5f60b527b938c0778e8f725c635ce0dc5ed7a4e01fd6252aa2cdb64da2f625bc
|
P e05f743f619a6b60d0782ee85c73f6866696962954d7cb3eceb03af79c6a6189 c5f96a085db9688a09793f52ce1ecf033c2e6e2e5873a19fe0fb374b242b317f
|
||||||
R 85d11a764a8467f79a2f960f315d2498
|
R 31456ba351a9908f0290d907623e53a3
|
||||||
U drh
|
U drh
|
||||||
Z bb3c80c49aabc721f930978bf9b4a8db
|
Z e9b8258d5115889cfb737fd42109ec8d
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
e05f743f619a6b60d0782ee85c73f6866696962954d7cb3eceb03af79c6a6189
|
4945a66237fa3861bc691d5fbef0d40286b596a0902b4f4c032d1d6528bb1a1b
|
||||||
84
src/expr.c
84
src/expr.c
@@ -2096,7 +2096,7 @@ int sqlite3ExprIsConstant(Expr *p){
|
|||||||
**
|
**
|
||||||
** When this routine returns true, it indicates that the expression
|
** When this routine returns true, it indicates that the expression
|
||||||
** can be added to the pParse->pConstExpr list and evaluated once when
|
** can be added to the pParse->pConstExpr list and evaluated once when
|
||||||
** the prepared statement starts up. See sqlite3ExprCodeAtInit().
|
** the prepared statement starts up. See sqlite3ExprCodeRunJustOnce().
|
||||||
*/
|
*/
|
||||||
int sqlite3ExprIsConstantNotJoin(Expr *p){
|
int sqlite3ExprIsConstantNotJoin(Expr *p){
|
||||||
return exprIsConst(p, 2, 0);
|
return exprIsConst(p, 2, 0);
|
||||||
@@ -3805,8 +3805,13 @@ expr_code_doover:
|
|||||||
Table *pTab = pCol->pTab;
|
Table *pTab = pCol->pTab;
|
||||||
sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdxPTab,
|
sqlite3VdbeAddOp3(v, OP_Column, pAggInfo->sortingIdxPTab,
|
||||||
pCol->iSorterColumn, target);
|
pCol->iSorterColumn, target);
|
||||||
if( ALWAYS(pTab) && pCol->iColumn>=0 ){
|
if( pCol->iColumn<0 ){
|
||||||
sqlite3ColumnDefault(v, pTab, pCol->iColumn, target);
|
VdbeComment((v,"%s.rowid",pTab->zName));
|
||||||
|
}else{
|
||||||
|
VdbeComment((v,"%s.%s",pTab->zName,pTab->aCol[pCol->iColumn].zName));
|
||||||
|
if( pTab->aCol[pCol->iColumn].affinity==SQLITE_AFF_REAL ){
|
||||||
|
sqlite3VdbeAddOp1(v, OP_RealAffinity, target);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
@@ -4122,9 +4127,9 @@ expr_code_doover:
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
if( ConstFactorOk(pParse) && sqlite3ExprIsConstantNotJoin(pExpr) ){
|
if( ConstFactorOk(pParse) && sqlite3ExprIsConstantNotJoin(pExpr) ){
|
||||||
/* SQL functions can be expensive. So try to move constant functions
|
/* SQL functions can be expensive. So try to avoid running them
|
||||||
** out of the inner loop, even if that means an extra OP_Copy. */
|
** multiple times if we know they always give the same result */
|
||||||
return sqlite3ExprCodeAtInit(pParse, pExpr, -1);
|
return sqlite3ExprCodeRunJustOnce(pParse, pExpr, -1);
|
||||||
}
|
}
|
||||||
assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
|
assert( !ExprHasProperty(pExpr, EP_xIsSelect) );
|
||||||
assert( !ExprHasProperty(pExpr, EP_TokenOnly) );
|
assert( !ExprHasProperty(pExpr, EP_TokenOnly) );
|
||||||
@@ -4502,15 +4507,23 @@ expr_code_doover:
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** Factor out the code of the given expression to initialization time.
|
** Generate code that will evaluate expression pExpr just one time
|
||||||
|
** per prepared statement execution.
|
||||||
|
**
|
||||||
|
** If the expression uses functions (that might throw an exception) then
|
||||||
|
** guard them with an OP_Once opcode to ensure that the code is only executed
|
||||||
|
** once. If no functions are involved, then factor the code out and put it at
|
||||||
|
** the end of the prepared statement in the initialization section.
|
||||||
**
|
**
|
||||||
** If regDest>=0 then the result is always stored in that register and the
|
** If regDest>=0 then the result is always stored in that register and the
|
||||||
** result is not reusable. If regDest<0 then this routine is free to
|
** result is not reusable. If regDest<0 then this routine is free to
|
||||||
** store the value whereever it wants. The register where the expression
|
** store the value whereever it wants. The register where the expression
|
||||||
** is stored is returned. When regDest<0, two identical expressions will
|
** is stored is returned. When regDest<0, two identical expressions might
|
||||||
** code to the same register.
|
** code to the same register, if they do not contain function calls and hence
|
||||||
|
** are factored out into the initialization section at the end of the
|
||||||
|
** prepared statement.
|
||||||
*/
|
*/
|
||||||
int sqlite3ExprCodeAtInit(
|
int sqlite3ExprCodeRunJustOnce(
|
||||||
Parse *pParse, /* Parsing context */
|
Parse *pParse, /* Parsing context */
|
||||||
Expr *pExpr, /* The expression to code when the VDBE initializes */
|
Expr *pExpr, /* The expression to code when the VDBE initializes */
|
||||||
int regDest /* Store the value in this register */
|
int regDest /* Store the value in this register */
|
||||||
@@ -4528,14 +4541,29 @@ int sqlite3ExprCodeAtInit(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
pExpr = sqlite3ExprDup(pParse->db, pExpr, 0);
|
pExpr = sqlite3ExprDup(pParse->db, pExpr, 0);
|
||||||
p = sqlite3ExprListAppend(pParse, p, pExpr);
|
if( pExpr!=0 && ExprHasProperty(pExpr, EP_HasFunc) ){
|
||||||
if( p ){
|
Vdbe *v = pParse->pVdbe;
|
||||||
struct ExprList_item *pItem = &p->a[p->nExpr-1];
|
int addr;
|
||||||
pItem->reusable = regDest<0;
|
assert( v );
|
||||||
if( regDest<0 ) regDest = ++pParse->nMem;
|
addr = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v);
|
||||||
pItem->u.iConstExprReg = regDest;
|
pParse->okConstFactor = 0;
|
||||||
|
if( !pParse->db->mallocFailed ){
|
||||||
|
if( regDest<0 ) regDest = ++pParse->nMem;
|
||||||
|
sqlite3ExprCode(pParse, pExpr, regDest);
|
||||||
|
}
|
||||||
|
pParse->okConstFactor = 1;
|
||||||
|
sqlite3ExprDelete(pParse->db, pExpr);
|
||||||
|
sqlite3VdbeJumpHere(v, addr);
|
||||||
|
}else{
|
||||||
|
p = sqlite3ExprListAppend(pParse, p, pExpr);
|
||||||
|
if( p ){
|
||||||
|
struct ExprList_item *pItem = &p->a[p->nExpr-1];
|
||||||
|
pItem->reusable = regDest<0;
|
||||||
|
if( regDest<0 ) regDest = ++pParse->nMem;
|
||||||
|
pItem->u.iConstExprReg = regDest;
|
||||||
|
}
|
||||||
|
pParse->pConstExpr = p;
|
||||||
}
|
}
|
||||||
pParse->pConstExpr = p;
|
|
||||||
return regDest;
|
return regDest;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4560,7 +4588,7 @@ int sqlite3ExprCodeTemp(Parse *pParse, Expr *pExpr, int *pReg){
|
|||||||
&& sqlite3ExprIsConstantNotJoin(pExpr)
|
&& sqlite3ExprIsConstantNotJoin(pExpr)
|
||||||
){
|
){
|
||||||
*pReg = 0;
|
*pReg = 0;
|
||||||
r2 = sqlite3ExprCodeAtInit(pParse, pExpr, -1);
|
r2 = sqlite3ExprCodeRunJustOnce(pParse, pExpr, -1);
|
||||||
}else{
|
}else{
|
||||||
int r1 = sqlite3GetTempReg(pParse);
|
int r1 = sqlite3GetTempReg(pParse);
|
||||||
r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1);
|
r2 = sqlite3ExprCodeTarget(pParse, pExpr, r1);
|
||||||
@@ -4617,7 +4645,7 @@ void sqlite3ExprCodeCopy(Parse *pParse, Expr *pExpr, int target){
|
|||||||
*/
|
*/
|
||||||
void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){
|
void sqlite3ExprCodeFactorable(Parse *pParse, Expr *pExpr, int target){
|
||||||
if( pParse->okConstFactor && sqlite3ExprIsConstantNotJoin(pExpr) ){
|
if( pParse->okConstFactor && sqlite3ExprIsConstantNotJoin(pExpr) ){
|
||||||
sqlite3ExprCodeAtInit(pParse, pExpr, target);
|
sqlite3ExprCodeRunJustOnce(pParse, pExpr, target);
|
||||||
}else{
|
}else{
|
||||||
sqlite3ExprCodeCopy(pParse, pExpr, target);
|
sqlite3ExprCodeCopy(pParse, pExpr, target);
|
||||||
}
|
}
|
||||||
@@ -4677,7 +4705,7 @@ int sqlite3ExprCodeExprList(
|
|||||||
}else if( (flags & SQLITE_ECEL_FACTOR)!=0
|
}else if( (flags & SQLITE_ECEL_FACTOR)!=0
|
||||||
&& sqlite3ExprIsConstantNotJoin(pExpr)
|
&& sqlite3ExprIsConstantNotJoin(pExpr)
|
||||||
){
|
){
|
||||||
sqlite3ExprCodeAtInit(pParse, pExpr, target+i);
|
sqlite3ExprCodeRunJustOnce(pParse, pExpr, target+i);
|
||||||
}else{
|
}else{
|
||||||
int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i);
|
int inReg = sqlite3ExprCodeTarget(pParse, pExpr, target+i);
|
||||||
if( inReg!=target+i ){
|
if( inReg!=target+i ){
|
||||||
@@ -5237,21 +5265,7 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){
|
|||||||
&& ALWAYS((combinedFlags & EP_Reduced)==0)
|
&& ALWAYS((combinedFlags & EP_Reduced)==0)
|
||||||
){
|
){
|
||||||
if( pA->iColumn!=pB->iColumn ) return 2;
|
if( pA->iColumn!=pB->iColumn ) return 2;
|
||||||
if( pA->op2!=pB->op2 ){
|
if( pA->op2!=pB->op2 && pA->op==TK_TRUTH ) return 2;
|
||||||
if( pA->op==TK_TRUTH ) return 2;
|
|
||||||
if( pA->op==TK_FUNCTION && iTab<0 ){
|
|
||||||
/* Ex: CREATE TABLE t1(a CHECK( a<julianday('now') ));
|
|
||||||
** INSERT INTO t1(a) VALUES(julianday('now')+10);
|
|
||||||
** Without this test, sqlite3ExprCodeAtInit() will run on the
|
|
||||||
** the julianday() of INSERT first, and remember that expression.
|
|
||||||
** Then sqlite3ExprCodeInit() will see the julianday() in the CHECK
|
|
||||||
** constraint as redundant, reusing the one from the INSERT, even
|
|
||||||
** though the julianday() in INSERT lacks the critical NC_IsCheck
|
|
||||||
** flag. See ticket [830277d9db6c3ba1] (2019-10-30)
|
|
||||||
*/
|
|
||||||
return 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if( pA->op!=TK_IN && pA->iTable!=pB->iTable && pA->iTable!=iTab ){
|
if( pA->op!=TK_IN && pA->iTable!=pB->iTable && pA->iTable!=iTab ){
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4239,7 +4239,7 @@ void sqlite3ExprCodeGeneratedColumn(Parse*, Column*, int);
|
|||||||
#endif
|
#endif
|
||||||
void sqlite3ExprCodeCopy(Parse*, Expr*, int);
|
void sqlite3ExprCodeCopy(Parse*, Expr*, int);
|
||||||
void sqlite3ExprCodeFactorable(Parse*, Expr*, int);
|
void sqlite3ExprCodeFactorable(Parse*, Expr*, int);
|
||||||
int sqlite3ExprCodeAtInit(Parse*, Expr*, int);
|
int sqlite3ExprCodeRunJustOnce(Parse*, Expr*, int);
|
||||||
int sqlite3ExprCodeTemp(Parse*, Expr*, int*);
|
int sqlite3ExprCodeTemp(Parse*, Expr*, int*);
|
||||||
int sqlite3ExprCodeTarget(Parse*, Expr*, int);
|
int sqlite3ExprCodeTarget(Parse*, Expr*, int);
|
||||||
int sqlite3ExprCodeExprList(Parse*, ExprList*, int, int, u8);
|
int sqlite3ExprCodeExprList(Parse*, ExprList*, int, int, u8);
|
||||||
|
|||||||
@@ -1544,7 +1544,6 @@ case OP_Concat: { /* same as TK_CONCAT, in1, in2, out3 */
|
|||||||
pIn1 = &aMem[pOp->p1];
|
pIn1 = &aMem[pOp->p1];
|
||||||
pIn2 = &aMem[pOp->p2];
|
pIn2 = &aMem[pOp->p2];
|
||||||
pOut = &aMem[pOp->p3];
|
pOut = &aMem[pOp->p3];
|
||||||
testcase( pIn1==pIn2 );
|
|
||||||
testcase( pOut==pIn2 );
|
testcase( pOut==pIn2 );
|
||||||
assert( pIn1!=pOut );
|
assert( pIn1!=pOut );
|
||||||
flags1 = pIn1->flags;
|
flags1 = pIn1->flags;
|
||||||
|
|||||||
@@ -1477,4 +1477,24 @@ do_execsql_test func-34.10 {
|
|||||||
SELECT * FROM t1;
|
SELECT * FROM t1;
|
||||||
} {1 2}
|
} {1 2}
|
||||||
|
|
||||||
|
# 2020-03-11 COALESCE() should short-circuit
|
||||||
|
# See also ticket 3c9eadd2a6ba0aa5
|
||||||
|
# Both issues stem from the fact that functions that could
|
||||||
|
# throw exceptions were being factored out into initialization
|
||||||
|
# code. The fix was to put those function calls inside of
|
||||||
|
# OP_Once instead.
|
||||||
|
#
|
||||||
|
reset_db
|
||||||
|
do_execsql_test func-35.100 {
|
||||||
|
CREATE TABLE t1(x);
|
||||||
|
SELECT coalesce(x, abs(-9223372036854775808)) FROM t1;
|
||||||
|
} {}
|
||||||
|
do_execsql_test func-35.110 {
|
||||||
|
SELECT coalesce(x, 'xyz' LIKE printf('%.1000000c','y')) FROM t1;
|
||||||
|
} {}
|
||||||
|
do_execsql_test func-35.200 {
|
||||||
|
CREATE TABLE t0(c0 CHECK(ABS(-9223372036854775808)));
|
||||||
|
PRAGMA integrity_check;
|
||||||
|
} {ok}
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
|||||||
@@ -53,9 +53,10 @@ do_execsql_test func5-2.2 {
|
|||||||
WHERE x+counter1('hello')=counter1('hello')+x
|
WHERE x+counter1('hello')=counter1('hello')+x
|
||||||
ORDER BY +x;
|
ORDER BY +x;
|
||||||
} {}
|
} {}
|
||||||
|
set cvalue [db one {SELECT counter2('hello')+1}]
|
||||||
do_execsql_test func5-2.3 {
|
do_execsql_test func5-2.3 {
|
||||||
SELECT x, y FROM t2
|
SELECT x, y FROM t2
|
||||||
WHERE x+counter2('hello')=counter2('hello')+x
|
WHERE x+counter2('hello')=$cvalue+x
|
||||||
ORDER BY +x;
|
ORDER BY +x;
|
||||||
} {1 2 3 4 5 6 7 8}
|
} {1 2 3 4 5 6 7 8}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user