1
0
mirror of https://github.com/sqlite/sqlite.git synced 2025-08-07 02:42:48 +03:00

Add new assert() statements, which if they had existed three years ago,

would have detected the code generator problem fixed by the previous check-in.

FossilOrigin-Name: 166d1e5d26ef88e995f44182144891f60bd51c1aa585b4a148f01a920b2a8eea
This commit is contained in:
drh
2024-03-08 15:39:59 +00:00
parent 926fb60b05
commit 744e5672bf
5 changed files with 40 additions and 23 deletions

View File

@@ -1,5 +1,5 @@
C Silently\signore\sredundant\sON\sCONFLICT\sclauses\sin\san\sUPSERT.\s\sOnly\sthe\sfirst\nON\sCONFLICT\sfor\seach\sindex\sis\sactive.\s\sDo\snot\sissue\san\serror,\ssince\sthat\smight\nbreak\slegacy\squeries.\s\sBut\signore\sthe\sredundant\sON\sCONFLICT\sclauses\sto\sprevent\nproblems\ssuch\sas\sdescribed\sin\s[forum:/forumpost/919c6579c8|forum\spost\s919c6579c8]. C Add\snew\sassert()\sstatements,\swhich\sif\sthey\shad\sexisted\sthree\syears\sago,\nwould\shave\sdetected\sthe\scode\sgenerator\sproblem\sfixed\sby\sthe\sprevious\scheck-in.
D 2024-03-08T14:01:48.797 D 2024-03-08T15:39:59.999
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
@@ -820,11 +820,11 @@ F src/upsert.c 2e60567a0e9e8520c18671b30712a88dc73534474304af94f32bb5f3ef65ac65
F src/utf.c f23165685a67b4caf8ec08fb274cb3f319103decfb2a980b7cfd55d18dfa855e F src/utf.c f23165685a67b4caf8ec08fb274cb3f319103decfb2a980b7cfd55d18dfa855e
F src/util.c f27a17e6e43fa362abea4db507a1c409f0adc8048ecf4c6479e8d162158ed529 F src/util.c f27a17e6e43fa362abea4db507a1c409f0adc8048ecf4c6479e8d162158ed529
F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104 F src/vacuum.c 604fcdaebe76f3497c855afcbf91b8fa5046b32de3045bab89cc008d68e40104
F src/vdbe.c 7a33c5bb37e12ce35ac2d1d56a6429288b0b56c940ba660265c1428c67883729 F src/vdbe.c da8407be6055f5751bf85681542d130a320b4fd1f4d8719bf83a464743d9aae4
F src/vdbe.h c2d78d15112c3fc5ab87f5e8e0b75d2db1c624409de2e858c3d1aafb1650bb4f F src/vdbe.h c2d78d15112c3fc5ab87f5e8e0b75d2db1c624409de2e858c3d1aafb1650bb4f
F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c F src/vdbeInt.h 949669dfd8a41550d27dcb905b494f2ccde9a2e6c1b0b04daa1227e2e74c2b2c
F src/vdbeapi.c 8f57d60c89da0b60e6d4e272358c511f6bae4e24330bdb11f8b42f986d1bf21b F src/vdbeapi.c 8f57d60c89da0b60e6d4e272358c511f6bae4e24330bdb11f8b42f986d1bf21b
F src/vdbeaux.c 66161ba75c4a2d86aab124fe3cbcc2a752d8e4b1fc8c1fc6e00625db4798168c F src/vdbeaux.c e52815bc11fccedcc7acb14ae98c607a1c5b6c773ff4d584cd192432540502c9
F src/vdbeblob.c 13f9287b55b6356b4b1845410382d6bede203ceb29ef69388a4a3d007ffacbe5 F src/vdbeblob.c 13f9287b55b6356b4b1845410382d6bede203ceb29ef69388a4a3d007ffacbe5
F src/vdbemem.c 213bf303826c0ef702e3a2a69dab2309d84b8381b822c6787885859fd7cd4c4e F src/vdbemem.c 213bf303826c0ef702e3a2a69dab2309d84b8381b822c6787885859fd7cd4c4e
F src/vdbesort.c 237840ca1947511fa59bd4e18b9eeae93f2af2468c34d2427b059f896230a547 F src/vdbesort.c 237840ca1947511fa59bd4e18b9eeae93f2af2468c34d2427b059f896230a547
@@ -2101,7 +2101,7 @@ F tool/mkctimec.tcl a16682eae5f01f85e5861b2aa215ca0d46b4230658ee25977e02b4508566
F tool/mkkeywordhash.c b9faa0ae7e14e4dbbcd951cddd786bf46b8a65bb07b129ba8c0cfade723aaffd F tool/mkkeywordhash.c b9faa0ae7e14e4dbbcd951cddd786bf46b8a65bb07b129ba8c0cfade723aaffd
F tool/mkmsvcmin.tcl 8897d515ef7f94772322db95a3b6fce6c614d84fe0bdd06ba5a1c786351d5a1d F tool/mkmsvcmin.tcl 8897d515ef7f94772322db95a3b6fce6c614d84fe0bdd06ba5a1c786351d5a1d
F tool/mkopcodec.tcl 33d20791e191df43209b77d37f0ff0904620b28465cca6990cf8d60da61a07ef F tool/mkopcodec.tcl 33d20791e191df43209b77d37f0ff0904620b28465cca6990cf8d60da61a07ef
F tool/mkopcodeh.tcl 769d9e6a8b462323150dc13a8539d6064664b72974f7894befe2491cc73e05cd F tool/mkopcodeh.tcl 2b4e6967a670ef21bf53a164964c35c6163277d002a4c6f56fa231d68c88d023
F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa
F tool/mkpragmatab.tcl 32e359ccb21011958a821955254bd7a5fa7915d01a8c16fed91ffc8b40cb4adf F tool/mkpragmatab.tcl 32e359ccb21011958a821955254bd7a5fa7915d01a8c16fed91ffc8b40cb4adf
F tool/mkshellc.tcl b7adf08b82de60811d2cb6af05ff59fc17e5cd6f3e98743c14eaaa3f8971fed0 F tool/mkshellc.tcl b7adf08b82de60811d2cb6af05ff59fc17e5cd6f3e98743c14eaaa3f8971fed0
@@ -2177,8 +2177,8 @@ 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 29d9eb7d55755604781e507f6ca36c50d62fa8d8589ab932d7cefca94ba24f3e P d0ea6b6ba64dba9d68c2b391ccf1171ea96fcdd7409dafdb2b697accb00246b8
R 854945d64d6a5cfe38a3cc1c6a5b5bd3 R e2ddfd9aa39901e567d105504257c018
U drh U drh
Z 3c2e932dfbe4dcd203c5f3b4ed97d851 Z 9df6c164111bd68c49bf51ae68acbbe9
# Remove this line to create a well-formed Fossil manifest. # Remove this line to create a well-formed Fossil manifest.

View File

@@ -1 +1 @@
d0ea6b6ba64dba9d68c2b391ccf1171ea96fcdd7409dafdb2b697accb00246b8 166d1e5d26ef88e995f44182144891f60bd51c1aa585b4a148f01a920b2a8eea

View File

@@ -1129,7 +1129,7 @@ case OP_Return: { /* in1 */
** **
** See also: EndCoroutine ** See also: EndCoroutine
*/ */
case OP_InitCoroutine: { /* jump */ case OP_InitCoroutine: { /* jump0 */
assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) ); assert( pOp->p1>0 && pOp->p1<=(p->nMem+1 - p->nCursor) );
assert( pOp->p2>=0 && pOp->p2<p->nOp ); assert( pOp->p2>=0 && pOp->p2<p->nOp );
assert( pOp->p3>=0 && pOp->p3<p->nOp ); assert( pOp->p3>=0 && pOp->p3<p->nOp );
@@ -1182,7 +1182,7 @@ case OP_EndCoroutine: { /* in1 */
** **
** See also: InitCoroutine ** See also: InitCoroutine
*/ */
case OP_Yield: { /* in1, jump */ case OP_Yield: { /* in1, jump0 */
int pcDest; int pcDest;
pIn1 = &aMem[pOp->p1]; pIn1 = &aMem[pOp->p1];
assert( VdbeMemDynamic(pIn1)==0 ); assert( VdbeMemDynamic(pIn1)==0 );
@@ -2041,7 +2041,7 @@ case OP_AddImm: { /* in1 */
** without data loss, then jump immediately to P2, or if P2==0 ** without data loss, then jump immediately to P2, or if P2==0
** raise an SQLITE_MISMATCH exception. ** raise an SQLITE_MISMATCH exception.
*/ */
case OP_MustBeInt: { /* jump, in1 */ case OP_MustBeInt: { /* jump0, in1 */
pIn1 = &aMem[pOp->p1]; pIn1 = &aMem[pOp->p1];
if( (pIn1->flags & MEM_Int)==0 ){ if( (pIn1->flags & MEM_Int)==0 ){
applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding); applyAffinity(pIn1, SQLITE_AFF_NUMERIC, encoding);
@@ -4725,10 +4725,10 @@ case OP_ColumnsUsed: {
** **
** See also: Found, NotFound, SeekGt, SeekGe, SeekLt ** See also: Found, NotFound, SeekGt, SeekGe, SeekLt
*/ */
case OP_SeekLT: /* jump, in3, group, ncycle */ case OP_SeekLT: /* jump0, in3, group, ncycle */
case OP_SeekLE: /* jump, in3, group, ncycle */ case OP_SeekLE: /* jump0, in3, group, ncycle */
case OP_SeekGE: /* jump, in3, group, ncycle */ case OP_SeekGE: /* jump0, in3, group, ncycle */
case OP_SeekGT: { /* jump, in3, group, ncycle */ case OP_SeekGT: { /* jump0, in3, group, ncycle */
int res; /* Comparison result */ int res; /* Comparison result */
int oc; /* Opcode */ int oc; /* Opcode */
VdbeCursor *pC; /* The cursor to seek */ VdbeCursor *pC; /* The cursor to seek */
@@ -5395,7 +5395,7 @@ case OP_Found: { /* jump, in3, ncycle */
** **
** See also: Found, NotFound, NoConflict, SeekRowid ** See also: Found, NotFound, NoConflict, SeekRowid
*/ */
case OP_SeekRowid: { /* jump, in3, ncycle */ case OP_SeekRowid: { /* jump0, in3, ncycle */
VdbeCursor *pC; VdbeCursor *pC;
BtCursor *pCrsr; BtCursor *pCrsr;
int res; int res;
@@ -6154,7 +6154,7 @@ case OP_NullRow: {
** configured to use Prev, not Next. ** configured to use Prev, not Next.
*/ */
case OP_SeekEnd: /* ncycle */ case OP_SeekEnd: /* ncycle */
case OP_Last: { /* jump, ncycle */ case OP_Last: { /* jump0, ncycle */
VdbeCursor *pC; VdbeCursor *pC;
BtCursor *pCrsr; BtCursor *pCrsr;
int res; int res;
@@ -6271,7 +6271,7 @@ case OP_Sort: { /* jump ncycle */
** from the beginning toward the end. In other words, the cursor is ** from the beginning toward the end. In other words, the cursor is
** configured to use Next, not Prev. ** configured to use Next, not Prev.
*/ */
case OP_Rewind: { /* jump, ncycle */ case OP_Rewind: { /* jump0, ncycle */
VdbeCursor *pC; VdbeCursor *pC;
BtCursor *pCrsr; BtCursor *pCrsr;
int res; int res;
@@ -7279,7 +7279,9 @@ case OP_RowSetTest: { /* jump, in1, in3 */
** P1 contains the address of the memory cell that contains the first memory ** P1 contains the address of the memory cell that contains the first memory
** cell in an array of values used as arguments to the sub-program. P2 ** cell in an array of values used as arguments to the sub-program. P2
** contains the address to jump to if the sub-program throws an IGNORE ** contains the address to jump to if the sub-program throws an IGNORE
** exception using the RAISE() function. Register P3 contains the address ** exception using the RAISE() function. P2 might be zero, if there is
** no possibility that an IGNORE exception will be raised.
** Register P3 contains the address
** of a memory cell in this (the parent) VM that is used to allocate the ** of a memory cell in this (the parent) VM that is used to allocate the
** memory required by the sub-vdbe at runtime. ** memory required by the sub-vdbe at runtime.
** **
@@ -7287,7 +7289,7 @@ case OP_RowSetTest: { /* jump, in1, in3 */
** **
** If P5 is non-zero, then recursive program invocation is enabled. ** If P5 is non-zero, then recursive program invocation is enabled.
*/ */
case OP_Program: { /* jump */ case OP_Program: { /* jump0 */
int nMem; /* Number of memory registers for sub-program */ int nMem; /* Number of memory registers for sub-program */
int nByte; /* Bytes of runtime space required for sub-program */ int nByte; /* Bytes of runtime space required for sub-program */
Mem *pRt; /* Register to allocate runtime space */ Mem *pRt; /* Register to allocate runtime space */
@@ -8836,7 +8838,7 @@ case OP_Filter: { /* jump */
** error is encountered. ** error is encountered.
*/ */
case OP_Trace: case OP_Trace:
case OP_Init: { /* jump */ case OP_Init: { /* jump0 */
int i; int i;
#ifndef SQLITE_OMIT_TRACE #ifndef SQLITE_OMIT_TRACE
char *zTrace; char *zTrace;

View File

@@ -939,6 +939,14 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){
assert( aLabel!=0 ); /* True because of tag-20230419-1 */ assert( aLabel!=0 ); /* True because of tag-20230419-1 */
pOp->p2 = aLabel[ADDR(pOp->p2)]; pOp->p2 = aLabel[ADDR(pOp->p2)];
} }
/* OPFLG_JUMP opcodes never have P2==0, though OPFLG_JUMP0 opcodes
** might */
assert( pOp->p2>0
|| (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP0)!=0 );
/* Jumps never go off the end of the bytecode array */
assert( pOp->p2<p->nOp );
break; break;
} }
} }

View File

@@ -81,6 +81,7 @@ while {![eof $in]} {
set op($name) -1 set op($name) -1
set group($name) 0 set group($name) 0
set jump($name) 0 set jump($name) 0
set jump0($name) 0
set in1($name) 0 set in1($name) 0
set in2($name) 0 set in2($name) 0
set in3($name) 0 set in3($name) 0
@@ -109,6 +110,7 @@ while {![eof $in]} {
out2 {set out2($name) 1} out2 {set out2($name) 1}
out3 {set out3($name) 1} out3 {set out3($name) 1}
ncycle {set ncycle($name) 1} ncycle {set ncycle($name) 1}
jump0 {set jump($name) 1; set jump0($name) 1;}
} }
} }
if {$group($name)} { if {$group($name)} {
@@ -137,6 +139,7 @@ puts "/* Automatically generated. Do not edit */"
puts "/* See the tool/mkopcodeh.tcl script for details */" puts "/* See the tool/mkopcodeh.tcl script for details */"
foreach name {OP_Noop OP_Explain OP_Abortable} { foreach name {OP_Noop OP_Explain OP_Abortable} {
set jump($name) 0 set jump($name) 0
set jump0($name) 0
set in1($name) 0 set in1($name) 0
set in2($name) 0 set in2($name) 0
set in3($name) 0 set in3($name) 0
@@ -256,7 +259,9 @@ for {set i 0} {$i<=$max} {incr i} {
set name $def($i) set name $def($i)
puts -nonewline [format {#define %-16s %3d} $name $i] puts -nonewline [format {#define %-16s %3d} $name $i]
set com {} set com {}
if {[info exists jump($name)] && $jump($name)} { if {[info exists jump0($name)] && $jump0($name)} {
lappend com "jump0"
} elseif {[info exists jump($name)] && $jump($name)} {
lappend com "jump" lappend com "jump"
} }
if {[info exists sameas($i)]} { if {[info exists sameas($i)]} {
@@ -289,6 +294,7 @@ for {set i 0} {$i<=$max} {incr i} {
if {$out2($name)} {incr x 16} if {$out2($name)} {incr x 16}
if {$out3($name)} {incr x 32} if {$out3($name)} {incr x 32}
if {$ncycle($name)} {incr x 64} if {$ncycle($name)} {incr x 64}
if {$jump0($name)} {incr x 128}
} }
set bv($i) $x set bv($i) $x
} }
@@ -304,6 +310,7 @@ puts "#define OPFLG_IN3 0x08 /* in3: P3 is an input */"
puts "#define OPFLG_OUT2 0x10 /* out2: P2 is an output */" puts "#define OPFLG_OUT2 0x10 /* out2: P2 is an output */"
puts "#define OPFLG_OUT3 0x20 /* out3: P3 is an output */" puts "#define OPFLG_OUT3 0x20 /* out3: P3 is an output */"
puts "#define OPFLG_NCYCLE 0x40 /* ncycle:Cycles count against P1 */" puts "#define OPFLG_NCYCLE 0x40 /* ncycle:Cycles count against P1 */"
puts "#define OPFLG_JUMP0 0x80 /* jump0: P2 might be zero */"
puts "#define OPFLG_INITIALIZER \173\\" puts "#define OPFLG_INITIALIZER \173\\"
for {set i 0} {$i<=$max} {incr i} { for {set i 0} {$i<=$max} {incr i} {
if {$i%8==0} { if {$i%8==0} {