]> git.ipfire.org Git - thirdparty/sqlite.git/commitdiff
Add support for generated columns.
authordrh <drh@noemail.net>
Sat, 26 Oct 2019 18:47:47 +0000 (18:47 +0000)
committerdrh <drh@noemail.net>
Sat, 26 Oct 2019 18:47:47 +0000 (18:47 +0000)
FossilOrigin-Name: b855acf1831943b3914491ed0bc333131321930cab480a5281012a3aebbba492

1  2 
manifest
manifest.uuid
src/build.c
src/insert.c

diff --cc manifest
index 9eb5fce1f1f8513c0e6a9a7043f3f4f577c76891,cb1c0c9c9ae43b8c0f5dfa067a64a148c161ae6c..8fac97f608d7a8ae96ed944228295ff341875d32
+++ b/manifest
@@@ -1,5 -1,5 +1,5 @@@
- C Performance\soptimization\son\ssqlite3GenerateConstraintChecks()\s-\sbypass\sthe\nloop\sthat\schecks\seach\scolumn\sfor\sNOT\sNULL\sconstraints\sif\sit\sis\sknown\sin\nadvance\sthat\sthe\stable\shas\sno\sNOT\sNULL\sconstraints.
- D 2019-10-26T17:08:06.316
 -C Merge\sfixes\sfrom\strunk.
 -D 2019-10-24T23:43:32.999
++C Add\ssupport\sfor\sgenerated\scolumns.
++D 2019-10-26T18:47:47.117
  F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
  F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
  F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724
@@@ -467,10 -467,10 +467,10 @@@ F src/auth.c a3d5bfdba83d25abed1013a8c7
  F src/backup.c f70077d40c08b7787bfe934e4d1da8030cb0cc57d46b345fba2294b7d1be23ab
  F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33
  F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6
 -F src/btree.c a8a9c2ce62bdf54c8cf9795143d7cb10b7473a1230a0572f702d061ffcceefe5
 +F src/btree.c 12e251f8c3eaad05e6d0db94772bf779b3a644e18d884025da6bcbc98cad1d22
  F src/btree.h f27a33c49280209a93385e218306c4ee5f46ba8d7649d2f81a7166b282232484
  F src/btreeInt.h 91806f01fd1145a9a86ba3042f25c38d8faf6002701bf5e780742cf88bcff437
- F src/build.c 2e17f27da8ff7bb52cd23dbd6a8c7269babf11bb1beae08e470c5b0f4b077801
 -F src/build.c 0c9704f95817aa585fdad2668c611280d0b62bc4c1c836cd1c797ba96879a7d6
++F src/build.c 3dea3b75107c83243b8b2244334c3c574865a12d33d0b86d345123f4dc1ca8d6
  F src/callback.c 88615dfc0a82167b65b452b4b305dbf86be77200b3343c6ffc6d03e92a01d181
  F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e
  F src/ctime.c 1b0724e66f95f33b160b1af85caaf9cceb325d22abf39bd24df4f54a73982251
@@@ -487,7 -487,7 +487,7 @@@ F src/hash.c 8d7dda241d0ebdafb6ffdeda31
  F src/hash.h 9d56a9079d523b648774c1784b74b89bd93fac7b365210157482e4319a468f38
  F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da
  F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71
- F src/insert.c 09e64dd9394a06bb25e54180312f16932c98643b53f576a7dd3b9344a635cf2c
 -F src/insert.c 4c934e7f46c14e662e31613fb5bc5d1847c4b2fd7b6a878ab173ca6ef362d4ab
++F src/insert.c 948bbd90277450f8d4f9ba4b881dd6676023d9e8bad56228064184dc85011cca
  F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa
  F src/loadext.c 4ddc65ae13c0d93db0ceedc8b14a28c8c260513448b0eb8c5a2ac375e3b6a85d
  F src/main.c 3e01f6a1c96643381b5f9d79e4ff7f2520bc5712197746fb0852283e78cccf66
@@@ -524,10 -524,10 +524,10 @@@ F src/pragma.h 40962d65b645bb3f08c1f4c4
  F src/prepare.c 6049beb71385f017af6fc320d2c75a4e50b75e280c54232442b785fbb83df057
  F src/printf.c 9be6945837c839ba57837b4bc3af349eba630920fa5532aa518816defe42a7d4
  F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384
- F src/resolve.c e021be0c1c4a2125fa38aabcd8dbb764bf5b2c889a948c30d3708430ec6ccd00
+ F src/resolve.c 9d6a3bdca1ebc759c4616fee0d7dd4cf62741f53db3a6b0117600f27c5b1406a
  F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93
 -F src/select.c 9c81d168b5a7ddc2277a6f6d3daec9ddd0ff5cebf12628d7e342f3c337231e7e
 -F src/shell.c.in 3093bdf5eedd91da08f0268f1442aa510a60798c9441868149ddbecdf8bcaa79
 +F src/select.c 3395765ea3749341deb4c25e8339c3d626a8ac641a52c216e9632e48e620ba68
 +F src/shell.c.in 01d14c1e0a4dc45b6029baf1aa560de92b6b12c05a87e2270c1e4fc41ca0fd1e
  F src/sqlite.h.in 5725a6b20190a1e8d662077a1c1c8ea889ad7be90dd803f914c2de226f5fe6ab
  F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
  F src/sqlite3ext.h cef696ce3293242c67b2339763608427bf72ee66f1f3a05389ac2a7b46001c31
@@@ -1848,7 -1848,7 +1848,8 @@@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a9
  F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
  F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
  F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
- P 8c0042bd5ccd83f8794d19cbb1ec7564584f0dce54bfebc0ada00b836aca065f
- R ea2c4191b4b2904c1eb46d03fcd394de
 -P b99d5701312f7472e6b606bd824f9273617e2655920485bf50aa96d408064721 8d964e1c21d4cea699023e02b0616a75c5859dd083c9365cdcbc0676ebbdaae4
 -R 6be8af4fed012ba4b6cd154b1c5c04cd
++P e3c3f4d7872f431a95627d52553101388c1e39458cc7e7f93fc81255f49a89a5 4ec57d88415fa4ea2e99d4a5671074ec6829d6824bc8509d5ae9c978d47d1419
++R f145bc7e6a3c49b3acdcdeb1a4214a2e
++T +closed 4ec57d88415fa4ea2e99d4a5671074ec6829d6824bc8509d5ae9c978d47d1419
  U drh
- Z 5817472d3119aa1dc0ce67b1f895a616
 -Z 9721b48c1c0b317285dab74d2e56c0b3
++Z 906ad86e78e219feca2ac3d876e5c4a1
diff --cc manifest.uuid
index ea0e6e60489e7c8cae52c4aa4d7b6b24df80513c,3e520c8b6288be1172dcd266ed9b96308d467f95..f10065993b54156686da97b9f2ca10c6f7e4d233
@@@ -1,1 -1,1 +1,1 @@@
- e3c3f4d7872f431a95627d52553101388c1e39458cc7e7f93fc81255f49a89a5
 -4ec57d88415fa4ea2e99d4a5671074ec6829d6824bc8509d5ae9c978d47d1419
++b855acf1831943b3914491ed0bc333131321930cab480a5281012a3aebbba492
diff --cc src/build.c
Simple merge
diff --cc src/insert.c
index 215aafb321ef5c5fbc16f7426979747a48c0fc0e,51e8baf8566c08350fe32aa92d2ea72a9f49c412..afec78b46904d894b2a479e30c6b648eac28022f
@@@ -1352,63 -1478,65 +1485,69 @@@ void sqlite3GenerateConstraintChecks
  
    /* Test all NOT NULL constraints.
    */
 -  for(i=0; i<nCol; i++){
 -    int iReg;
 -    if( i==pTab->iPKey ){
 -      continue;        /* ROWID is never NULL */
 -    }
 -    if( aiChng && aiChng[i]<0 ){
 -      /* Don't bother checking for NOT NULL on columns that do not change */
 -      continue;
 -    }
 -    onError = pTab->aCol[i].notNull;
 -    if( onError==OE_None ) continue;  /* This column is allowed to be NULL */
 -    if( overrideError!=OE_Default ){
 -      onError = overrideError;
 -    }else if( onError==OE_Default ){
 -      onError = OE_Abort;
 -    }
 -    if( onError==OE_Replace && pTab->aCol[i].pDflt==0 ){
 -      onError = OE_Abort;
 -    }
 -    assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail
 -        || onError==OE_Ignore || onError==OE_Replace );
 -    addr1 = 0;
 -    testcase( i!=sqlite3TableColumnToStorage(pTab, i) );
 -    testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL );
 -    testcase( pTab->aCol[i].colFlags & COLFLAG_STORED );
 -    iReg = sqlite3TableColumnToStorage(pTab, i) + regNewData + 1;
 -    switch( onError ){
 -      case OE_Replace: {
 -        assert( onError==OE_Replace );
 -        addr1 = sqlite3VdbeMakeLabel(pParse);
 -        sqlite3VdbeAddOp2(v, OP_NotNull, iReg, addr1);
 -          VdbeCoverage(v);
 -        sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i);
 -        sqlite3VdbeAddOp2(v, OP_NotNull, iReg, addr1);
 -          VdbeCoverage(v);
 +  if( pTab->tabFlags & TF_HasNotNull ){
 +    for(i=0; i<nCol; i++){
++      int iReg;
 +      onError = pTab->aCol[i].notNull;
 +      if( onError==OE_None ) continue; /* No NOT NULL on this column */
-       assert( pTab->tabFlags & TF_HasNotNull );
 +      if( i==pTab->iPKey ){
 +        continue;        /* ROWID is never NULL */
 +      }
 +      if( aiChng && aiChng[i]<0 ){
 +        /* Don't bother checking for NOT NULL on columns that do not change */
 +        continue;
 +      }
++      onError = pTab->aCol[i].notNull;
++      if( onError==OE_None ) continue;  /* This column is allowed to be NULL */
 +      if( overrideError!=OE_Default ){
 +        onError = overrideError;
 +      }else if( onError==OE_Default ){
          onError = OE_Abort;
 -        /* Fall through into the OE_Abort case to generate code that runs
 -        ** if both the input and the default value are NULL */
        }
 -      case OE_Abort:
 -        sqlite3MayAbort(pParse);
 -        /* Fall through */
 -      case OE_Rollback:
 -      case OE_Fail: {
 -        char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName,
 -                                    pTab->aCol[i].zName);
 -        sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL, onError,
 -                          iReg);
 -        sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC);
 -        sqlite3VdbeChangeP5(v, P5_ConstraintNotNull);
 -        VdbeCoverage(v);
 -        if( addr1 ) sqlite3VdbeResolveLabel(v, addr1);
 -        break;
 +      if( onError==OE_Replace && pTab->aCol[i].pDflt==0 ){
 +        onError = OE_Abort;
        }
 -      default: {
 -        assert( onError==OE_Ignore );
 -        sqlite3VdbeAddOp2(v, OP_IsNull, iReg, ignoreDest);
 -        VdbeCoverage(v);
 -        break;
 +      assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail
 +          || onError==OE_Ignore || onError==OE_Replace );
 +      addr1 = 0;
++      testcase( i!=sqlite3TableColumnToStorage(pTab, i) );
++      testcase( pTab->aCol[i].colFlags & COLFLAG_VIRTUAL );
++      testcase( pTab->aCol[i].colFlags & COLFLAG_STORED );
++      iReg = sqlite3TableColumnToStorage(pTab, i) + regNewData + 1;
 +      switch( onError ){
 +        case OE_Replace: {
 +          assert( onError==OE_Replace );
 +          addr1 = sqlite3VdbeMakeLabel(pParse);
-           sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1);
++          sqlite3VdbeAddOp2(v, OP_NotNull, iReg, addr1);
 +            VdbeCoverage(v);
 +          sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i);
-           sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1);
++          sqlite3VdbeAddOp2(v, OP_NotNull, iReg, addr1);
 +            VdbeCoverage(v);
 +          onError = OE_Abort;
 +          /* Fall through into the OE_Abort case to generate code that runs
 +          ** if both the input and the default value are NULL */
 +        }
 +        case OE_Abort:
 +          sqlite3MayAbort(pParse);
 +          /* Fall through */
 +        case OE_Rollback:
 +        case OE_Fail: {
 +          char *zMsg = sqlite3MPrintf(db, "%s.%s", pTab->zName,
 +                                      pTab->aCol[i].zName);
 +          sqlite3VdbeAddOp3(v, OP_HaltIfNull, SQLITE_CONSTRAINT_NOTNULL,
-                             onError, regNewData+1+i);
++                            onError, iReg);
 +          sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC);
 +          sqlite3VdbeChangeP5(v, P5_ConstraintNotNull);
 +          VdbeCoverage(v);
 +          if( addr1 ) sqlite3VdbeResolveLabel(v, addr1);
 +          break;
 +        }
 +        default: {
 +          assert( onError==OE_Ignore );
-           sqlite3VdbeAddOp2(v, OP_IsNull, regNewData+1+i, ignoreDest);
++          sqlite3VdbeAddOp2(v, OP_IsNull, iReg, ignoreDest);
 +          VdbeCoverage(v);
 +          break;
 +        }
        }
      }
    }