From 0da56938db08afd5a7ac8ad758fb840a5fed1232 Mon Sep 17 00:00:00 2001 From: drh Date: Wed, 20 Mar 2019 20:27:20 +0000 Subject: [PATCH] Experimental change to apply affinity before running CHECK constraints on an INSERT. Note that in the CHECK constraints, REAL affinity really is REAL affinity, and not numeric affinity. This causes failures in some tests that are assuming affinity is applied after CHECK constraints. FossilOrigin-Name: 9ef69d183927a26b293907e09d2e1d03c4125315178801d839cc64a50d1877af --- manifest | 15 +++++++++------ manifest.uuid | 2 +- src/insert.c | 9 +++++++++ 3 files changed, 19 insertions(+), 7 deletions(-) diff --git a/manifest b/manifest index 1603306874..8f5ac34890 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C In\sthe\sCLI,\sgive\sbetter\serror\smessages\sif\ssomething\sgoes\swrong\nwith\sthe\s".dbinfo"\scommand. -D 2019-03-20T18:22:51.910 +C Experimental\schange\sto\sapply\saffinity\sbefore\srunning\sCHECK\sconstraints\son\nan\sINSERT.\s\sNote\sthat\sin\sthe\sCHECK\sconstraints,\sREAL\saffinity\sreally\sis\nREAL\saffinity,\sand\snot\snumeric\saffinity.\sThis\scauses\sfailures\sin\ssome\stests\nthat\sare\sassuming\saffinity\sis\sapplied\safter\sCHECK\sconstraints. +D 2019-03-20T20:27:20.721 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -477,7 +477,7 @@ F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 4ce12b5ba3bcbfa17ec37ce960d499fc287b6289df2c00b31201f716a3c7df45 +F src/insert.c 51a6219664f3fdd3fe7aea12ec8bd5bd35c14e5b5b0e05cfeffcd0e79d7aaf9a F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 27d7265625ea6eaccdfe7c53ef41adc179c9357a077702a860c1a3b0a037a16f @@ -1807,7 +1807,10 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P b9e2393cf201e3fc24519c5ae65d0a5953147d78884e53d44a7958747b4a7e13 -R bac077ecc3827c57122ba7154b5e4a1d +P 3649a77b79001ea6c5defe882f9934521b20b9d36aab26d03b5d42006c7fa228 +R c62b2b78dc2ca8850c277849afe0ea49 +T *branch * apply-affinity-first +T *sym-apply-affinity-first * +T -sym-trunk * U drh -Z 6a80d73acf1c73bf71a6659d9de2609c +Z d079a1d17a8c52037e914a1081005999 diff --git a/manifest.uuid b/manifest.uuid index e31be56ea8..70053f0735 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -3649a77b79001ea6c5defe882f9934521b20b9d36aab26d03b5d42006c7fa228 \ No newline at end of file +9ef69d183927a26b293907e09d2e1d03c4125315178801d839cc64a50d1877af \ No newline at end of file diff --git a/src/insert.c b/src/insert.c index a68db1a1d2..0c54294eb0 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1396,8 +1396,17 @@ void sqlite3GenerateConstraintChecks( #ifndef SQLITE_OMIT_CHECK if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ ExprList *pCheck = pTab->pCheck; + VdbeOp *pOp; pParse->iSelfTab = -(regNewData+1); onError = overrideError!=OE_Default ? overrideError : OE_Abort; + sqlite3TableAffinity(v, pTab, regNewData+1); + pOp = sqlite3VdbeGetOp(v, -1); + if( pOp->opcode==OP_Affinity && pOp->p4.z!=0 ){ + const char *zAff = pOp->p4.z; + for(i=0; zAff[i]; i++){ + if( zAff[i]=='E' ) sqlite3VdbeAddOp1(v,OP_RealAffinity,regNewData+i+1); + } + } for(i=0; inExpr; i++){ int allOk; Expr *pExpr = pCheck->a[i].pExpr; -- 2.39.5