mirror of
https://github.com/sqlite/sqlite.git
synced 2025-07-29 08:01:23 +03:00
Extend the pedantic enforcement of type to VIRTUAL columns.
FossilOrigin-Name: b734c74e55acb26eb61b60937bef870f4b55b2e2e7560a22362f5f31ba2fcd03
This commit is contained in:
16
manifest
16
manifest
@ -1,5 +1,5 @@
|
|||||||
C Enforce\sjudgmental\styping\son\sSTORED\sgenerated\scolumns\sfor\sSTRICT\ntables.\s\s[forum:/forumpost/6caf195248a849e4|Forum\spost\s6caf195248].
|
C Extend\sthe\spedantic\senforcement\sof\stype\sto\sVIRTUAL\scolumns.
|
||||||
D 2025-06-18T16:17:00.665
|
D 2025-06-18T19:04:28.743
|
||||||
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
|
F .fossil-settings/binary-glob 61195414528fb3ea9693577e1980230d78a1f8b0a54c78cf1b9b24d0a409ed6a x
|
||||||
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1
|
||||||
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea
|
||||||
@ -736,7 +736,7 @@ F src/date.c 9db4d604e699a73e10b8e85a44db074a1f04c0591a77e2abfd77703f50dce1e9
|
|||||||
F src/dbpage.c b3e218f8ed74fcbb7fa805df8ca669a3718d397617b3d8a8aac3307dc315c4d6
|
F src/dbpage.c b3e218f8ed74fcbb7fa805df8ca669a3718d397617b3d8a8aac3307dc315c4d6
|
||||||
F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c
|
F src/dbstat.c 73362c0df0f40ad5523a6f5501224959d0976757b511299bf892313e79d14f5c
|
||||||
F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42
|
F src/delete.c 03a77ba20e54f0f42ebd8eddf15411ed6bdb06a2c472ac4b6b336521bf7cea42
|
||||||
F src/expr.c f16fa5cbd849991462edf1d31bb7def5b970bb9611afcb4ea21c77e88e52a220
|
F src/expr.c 5f7fe80f3397597565b43154bed8b012aacc81e0d30706c742e3b975c591db3b
|
||||||
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007
|
||||||
F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f
|
F src/fkey.c 928ed2517e8732113d2b9821aa37af639688d752f4ea9ac6e0e393d713eeb76f
|
||||||
F src/func.c de47a8295503aa130baae5e6d9868ecf4f7c4dbffa65d83ad1f70bdbac0ee2d6
|
F src/func.c de47a8295503aa130baae5e6d9868ecf4f7c4dbffa65d83ad1f70bdbac0ee2d6
|
||||||
@ -852,7 +852,7 @@ F src/upsert.c 215328c3f91623c520ec8672c44323553f12caeb4f01b1090ebdca99fdf7b4f1
|
|||||||
F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165
|
F src/utf.c 7267c3fb9e2467020507601af3354c2446c61f444387e094c779dccd5ca62165
|
||||||
F src/util.c 36fb1150062957280777655976f3f9a75db236cb8207a0770ceae8d5ec17fcd3
|
F src/util.c 36fb1150062957280777655976f3f9a75db236cb8207a0770ceae8d5ec17fcd3
|
||||||
F src/vacuum.c 1bacdd0a81d2b5dc1c508fbf0d938c89fa78dd8d5b46ec92686d44030d4f4789
|
F src/vacuum.c 1bacdd0a81d2b5dc1c508fbf0d938c89fa78dd8d5b46ec92686d44030d4f4789
|
||||||
F src/vdbe.c 714fab7aa7c516edbcf5e4f653ae8f548a3e24c0ed19086d7383bb5851983992
|
F src/vdbe.c e320cd37883dd3458d70c8cf714750c51957c38b87ebb5e24a56d5e5f7434656
|
||||||
F src/vdbe.h 93761ed7c6b8bc19524912fd9b9b587d41bf4f1d0ade650a00dadc10518d8958
|
F src/vdbe.h 93761ed7c6b8bc19524912fd9b9b587d41bf4f1d0ade650a00dadc10518d8958
|
||||||
F src/vdbeInt.h 0bc581a9763be385e3af715e8c0a503ba8422c2b7074922faf4bb0d6ae31b15e
|
F src/vdbeInt.h 0bc581a9763be385e3af715e8c0a503ba8422c2b7074922faf4bb0d6ae31b15e
|
||||||
F src/vdbeapi.c 613a6f29efacd6ed83e886b6e52db0fe52ba80a596b0a137608db1948bad90a9
|
F src/vdbeapi.c 613a6f29efacd6ed83e886b6e52db0fe52ba80a596b0a137608db1948bad90a9
|
||||||
@ -1701,7 +1701,7 @@ F test/statfault.test 064f43379e4992b5221b7d9ac887c313b3191f85cce605d78e416fc404
|
|||||||
F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75
|
F test/stmt.test 54ed2cc0764bf3e48a058331813c3dbd19fc1d0827c3d8369914a5d8f564ec75
|
||||||
F test/stmtrand.test 340e2ea4841c5cdc02d36e33739769c5d907ab529b12bb535407def0e413ca17
|
F test/stmtrand.test 340e2ea4841c5cdc02d36e33739769c5d907ab529b12bb535407def0e413ca17
|
||||||
F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5
|
F test/stmtvtab1.test 6873dfb24f8e79cbb5b799b95c2e4349060eb7a3b811982749a84b359468e2d5
|
||||||
F test/strict1.test 62db60132bb286429a36cd69a218184d78923990b066f131862ecb648105cee0
|
F test/strict1.test a7f9091603fe71cdc62baab0766684cba12a97ec69bfbb70be965532669cd77a
|
||||||
F test/strict2.test b22c7a98b5000aef937f1990776497f0e979b1a23bc4f63e2d53b00e59b20070
|
F test/strict2.test b22c7a98b5000aef937f1990776497f0e979b1a23bc4f63e2d53b00e59b20070
|
||||||
F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49
|
F test/subjournal.test 8d4e2572c0ee9a15549f0d8e40863161295107e52f07a3e8012a2e1fdd093c49
|
||||||
F test/subquery.test 23087f9b1c15ab9cc5231d04946bdebc51db527c95eb9d7434a2222127e17a84
|
F test/subquery.test 23087f9b1c15ab9cc5231d04946bdebc51db527c95eb9d7434a2222127e17a84
|
||||||
@ -2208,8 +2208,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350
|
|||||||
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
|
F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7
|
||||||
F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
|
F tool/warnings.sh 1ad0169b022b280bcaaf94a7fa231591be96b514230ab5c98fbf15cd7df842dd
|
||||||
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f
|
||||||
P 986b601db11a041d280eb61004723604bf4b6fd573b9832c97e3a9da9ea16e9a
|
P 5e9279bff0482806f86657ae05ca3e916708d138bc3c3ceb3fbf454818649d44
|
||||||
R c89b9ea3a77e2b240253ae60cc2ec713
|
R f7012a27e3f9276304f8e87574dec03d
|
||||||
U drh
|
U drh
|
||||||
Z 41ec114b4104be2c73f80a11e6cae501
|
Z 4d43da8fdd303e39e12f04e0b9379a29
|
||||||
# Remove this line to create a well-formed Fossil manifest.
|
# Remove this line to create a well-formed Fossil manifest.
|
||||||
|
@ -1 +1 @@
|
|||||||
5e9279bff0482806f86657ae05ca3e916708d138bc3c3ceb3fbf454818649d44
|
b734c74e55acb26eb61b60937bef870f4b55b2e2e7560a22362f5f31ba2fcd03
|
||||||
|
@ -4269,7 +4269,12 @@ void sqlite3ExprCodeGeneratedColumn(
|
|||||||
iAddr = 0;
|
iAddr = 0;
|
||||||
}
|
}
|
||||||
sqlite3ExprCodeCopy(pParse, sqlite3ColumnExpr(pTab,pCol), regOut);
|
sqlite3ExprCodeCopy(pParse, sqlite3ColumnExpr(pTab,pCol), regOut);
|
||||||
if( pCol->affinity>=SQLITE_AFF_TEXT ){
|
if( (pCol->colFlags & COLFLAG_VIRTUAL)!=0
|
||||||
|
&& (pTab->tabFlags & TF_Strict)!=0
|
||||||
|
){
|
||||||
|
int p3 = 2+(int)(pCol - pTab->aCol);
|
||||||
|
sqlite3VdbeAddOp4(v, OP_TypeCheck, regOut, 1, p3, (char*)pTab, P4_TABLE);
|
||||||
|
}else if( pCol->affinity>=SQLITE_AFF_TEXT ){
|
||||||
sqlite3VdbeAddOp4(v, OP_Affinity, regOut, 1, 0, &pCol->affinity, 1);
|
sqlite3VdbeAddOp4(v, OP_Affinity, regOut, 1, 0, &pCol->affinity, 1);
|
||||||
}
|
}
|
||||||
if( iAddr ) sqlite3VdbeJumpHere(v, iAddr);
|
if( iAddr ) sqlite3VdbeJumpHere(v, iAddr);
|
||||||
|
33
src/vdbe.c
33
src/vdbe.c
@ -3239,6 +3239,15 @@ op_column_corrupt:
|
|||||||
** Take the affinities from the Table object in P4. If any value
|
** Take the affinities from the Table object in P4. If any value
|
||||||
** cannot be coerced into the correct type, then raise an error.
|
** cannot be coerced into the correct type, then raise an error.
|
||||||
**
|
**
|
||||||
|
** If P3==0, then omit checking of VIRTUAL columns.
|
||||||
|
**
|
||||||
|
** If P3==1, then omit checking of all generated column, both VIRTUAL
|
||||||
|
** and STORED.
|
||||||
|
**
|
||||||
|
** If P3>=2, then only check column number P3-2 in the table (which will
|
||||||
|
** be a VIRTUAL column) against the value in reg[P1]. In this case,
|
||||||
|
** P2 will be 1.
|
||||||
|
**
|
||||||
** This opcode is similar to OP_Affinity except that this opcode
|
** This opcode is similar to OP_Affinity except that this opcode
|
||||||
** forces the register type to the Table column type. This is used
|
** forces the register type to the Table column type. This is used
|
||||||
** to implement "strict affinity".
|
** to implement "strict affinity".
|
||||||
@ -3252,8 +3261,8 @@ op_column_corrupt:
|
|||||||
**
|
**
|
||||||
** <ul>
|
** <ul>
|
||||||
** <li> P2 should be the number of non-virtual columns in the
|
** <li> P2 should be the number of non-virtual columns in the
|
||||||
** table of P4.
|
** table of P4 unless P3>1, in which case P2 will be 1.
|
||||||
** <li> Table P4 should be a STRICT table.
|
** <li> Table P4 is a STRICT table.
|
||||||
** </ul>
|
** </ul>
|
||||||
**
|
**
|
||||||
** If any precondition is false, an assertion fault occurs.
|
** If any precondition is false, an assertion fault occurs.
|
||||||
@ -3262,16 +3271,28 @@ case OP_TypeCheck: {
|
|||||||
Table *pTab;
|
Table *pTab;
|
||||||
Column *aCol;
|
Column *aCol;
|
||||||
int i;
|
int i;
|
||||||
|
int nCol;
|
||||||
|
|
||||||
assert( pOp->p4type==P4_TABLE );
|
assert( pOp->p4type==P4_TABLE );
|
||||||
pTab = pOp->p4.pTab;
|
pTab = pOp->p4.pTab;
|
||||||
assert( pTab->tabFlags & TF_Strict );
|
assert( pTab->tabFlags & TF_Strict );
|
||||||
assert( pTab->nNVCol==pOp->p2 );
|
assert( pOp->p3>=0 && pOp->p3<pTab->nCol+2 );
|
||||||
aCol = pTab->aCol;
|
aCol = pTab->aCol;
|
||||||
pIn1 = &aMem[pOp->p1];
|
pIn1 = &aMem[pOp->p1];
|
||||||
for(i=0; i<pTab->nCol; i++){
|
if( pOp->p3<2 ){
|
||||||
if( aCol[i].colFlags & COLFLAG_GENERATED ){
|
assert( pTab->nNVCol==pOp->p2 );
|
||||||
if( aCol[i].colFlags & COLFLAG_VIRTUAL ) continue;
|
i = 0;
|
||||||
|
nCol = pTab->nCol;
|
||||||
|
}else{
|
||||||
|
i = pOp->p3-2;
|
||||||
|
nCol = i+1;
|
||||||
|
assert( i<pTab->nCol );
|
||||||
|
assert( aCol[i].colFlags & COLFLAG_VIRTUAL );
|
||||||
|
assert( pOp->p2==1 );
|
||||||
|
}
|
||||||
|
for(; i<nCol; i++){
|
||||||
|
if( (aCol[i].colFlags & COLFLAG_GENERATED)!=0 && pOp->p3<2 ){
|
||||||
|
if( (aCol[i].colFlags & COLFLAG_VIRTUAL)!=0 ) continue;
|
||||||
if( pOp->p3 ){ pIn1++; continue; }
|
if( pOp->p3 ){ pIn1++; continue; }
|
||||||
}
|
}
|
||||||
assert( pIn1 < &aMem[pOp->p1+pOp->p2] );
|
assert( pIn1 < &aMem[pOp->p1+pOp->p2] );
|
||||||
|
@ -212,4 +212,51 @@ do_catchsql_test strict1-9.2.43 {
|
|||||||
INSERT INTO strict(k) VALUES(43);
|
INSERT INTO strict(k) VALUES(43);
|
||||||
} {1 {cannot store TEXT value in BLOB column strict.c4}}
|
} {1 {cannot store TEXT value in BLOB column strict.c4}}
|
||||||
|
|
||||||
|
do_execsql_test strict1-9.3 {
|
||||||
|
DROP TABLE strict;
|
||||||
|
CREATE TABLE strict (
|
||||||
|
k INTEGER PRIMARY KEY,
|
||||||
|
c1 REAL AS(if(k=11,1.5, k=12,2, k=13,'x', k=14,x'34', 0.0)) VIRTUAL,
|
||||||
|
c2 INT AS(if(k=21,1.5, k=22,2, k=23,'x', k=24,x'34', 0)) VIRTUAL,
|
||||||
|
c3 TEXT AS(if(k=31,1.5, k=32,2, k=33,'x', k=34,x'34', 'x')) VIRTUAL,
|
||||||
|
c4 BLOB AS(if(k=41,1.5, k=42,2, k=43,'x', k=44,x'34', x'00')) VIRTUAL,
|
||||||
|
c5 ANY AS(if(k=51,1.5, k=52,2, k=53,'x', k=54,x'34', 0)) VIRTUAL
|
||||||
|
) STRICT;
|
||||||
|
INSERT INTO strict(k) VALUES(11);
|
||||||
|
INSERT INTO strict(k) VALUES(12);
|
||||||
|
INSERT INTO strict(k) VALUES(22);
|
||||||
|
INSERT INTO strict(k) VALUES(31);
|
||||||
|
INSERT INTO strict(k) VALUES(32);
|
||||||
|
INSERT INTO strict(k) VALUES(33);
|
||||||
|
INSERT INTO strict(k) VALUES(44);
|
||||||
|
PRAGMA integrity_check;
|
||||||
|
} {ok}
|
||||||
|
do_catchsql_test strict1-9.4.13 {
|
||||||
|
INSERT INTO strict(k) VALUES(13);
|
||||||
|
} {1 {cannot store TEXT value in REAL column strict.c1}}
|
||||||
|
do_catchsql_test strict1-9.4.14 {
|
||||||
|
INSERT INTO strict(k) VALUES(14);
|
||||||
|
} {1 {cannot store BLOB value in REAL column strict.c1}}
|
||||||
|
do_catchsql_test strict1-9.4.21 {
|
||||||
|
INSERT INTO strict(k) VALUES(21);
|
||||||
|
} {1 {cannot store REAL value in INT column strict.c2}}
|
||||||
|
do_catchsql_test strict1-9.4.23 {
|
||||||
|
INSERT INTO strict(k) VALUES(23);
|
||||||
|
} {1 {cannot store TEXT value in INT column strict.c2}}
|
||||||
|
do_catchsql_test strict1-9.4.24 {
|
||||||
|
INSERT INTO strict(k) VALUES(24);
|
||||||
|
} {1 {cannot store BLOB value in INT column strict.c2}}
|
||||||
|
do_catchsql_test strict1-9.4.34 {
|
||||||
|
INSERT INTO strict(k) VALUES(34);
|
||||||
|
} {1 {cannot store BLOB value in TEXT column strict.c3}}
|
||||||
|
do_catchsql_test strict1-9.4.41 {
|
||||||
|
INSERT INTO strict(k) VALUES(41);
|
||||||
|
} {1 {cannot store REAL value in BLOB column strict.c4}}
|
||||||
|
do_catchsql_test strict1-9.4.42 {
|
||||||
|
INSERT INTO strict(k) VALUES(42);
|
||||||
|
} {1 {cannot store INT value in BLOB column strict.c4}}
|
||||||
|
do_catchsql_test strict1-9.4.43 {
|
||||||
|
INSERT INTO strict(k) VALUES(43);
|
||||||
|
} {1 {cannot store TEXT value in BLOB column strict.c4}}
|
||||||
|
|
||||||
finish_test
|
finish_test
|
||||||
|
Reference in New Issue
Block a user