SQLite

Check-in [2401e047]
Login

Many hyperlinks are disabled.
Use anonymous login to enable hyperlinks.

Overview
Comment:Do not set OP_Column flags on the instructions generated by sqlite3ExprCodeGetColumn() if the opcode generated is not really an OP_Column, which might happen if the column is virtual. Fix for ticket [b439bfcfb7deedc6]
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 2401e04730a156aa48787b91af4e516406cb7635145e430be62fd16481816237
User & Date: drh 2019-12-14 17:43:37
Context
2019-12-14
18:08
Due to the previous change, the p5 parameter to OP_VColumn no longer ever contains extraneous bits, so change a testcase() into an assert() to show as much. (check-in: 5b4a88cd user: drh tags: trunk)
17:43
Do not set OP_Column flags on the instructions generated by sqlite3ExprCodeGetColumn() if the opcode generated is not really an OP_Column, which might happen if the column is virtual. Fix for ticket [b439bfcfb7deedc6] (check-in: 2401e047 user: drh tags: trunk)
15:01
Make the sqlite3ExprCodeTarget() expression code generator routine robust in the face of unknown opcodes - it simply generates a NULL value. (check-in: f8e876c8 user: drh tags: trunk)
Changes
Hide Diffs Unified Diffs Ignore Whitespace Patch

Changes to src/expr.c.

3483
3484
3485
3486
3487
3488
3489
3490

3491
3492
3493
3494
3495
3496
3497
  int iTable,      /* The cursor pointing to the table */
  int iReg,        /* Store results here */
  u8 p5            /* P5 value for OP_Column + FLAGS */
){
  assert( pParse->pVdbe!=0 );
  sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pTab, iTable, iColumn, iReg);
  if( p5 ){
    sqlite3VdbeChangeP5(pParse->pVdbe, p5);

  }
  return iReg;
}

/*
** Generate code to move content from registers iFrom...iFrom+nReg-1
** over to iTo..iTo+nReg-1.







|
>







3483
3484
3485
3486
3487
3488
3489
3490
3491
3492
3493
3494
3495
3496
3497
3498
  int iTable,      /* The cursor pointing to the table */
  int iReg,        /* Store results here */
  u8 p5            /* P5 value for OP_Column + FLAGS */
){
  assert( pParse->pVdbe!=0 );
  sqlite3ExprCodeGetColumnOfTable(pParse->pVdbe, pTab, iTable, iColumn, iReg);
  if( p5 ){
    VdbeOp *pOp = sqlite3VdbeGetOp(pParse->pVdbe,-1);
    if( pOp->opcode==OP_Column ) pOp->p5 = p5;
  }
  return iReg;
}

/*
** Generate code to move content from registers iFrom...iFrom+nReg-1
** over to iTo..iTo+nReg-1.

Changes to test/gencol1.test.

338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
sqlite3 db :memory:
do_execsql_test gencol1-12.10 {
  CREATE TABLE t0 (c0, c1 NOT NULL AS (c0==0));
  INSERT INTO t0(c0) VALUES (0);
  PRAGMA integrity_check;
} {ok}

# 2019-12-09 but report from Yongheng Chen
# Ensure that the SrcList_item.colUsed field is set correctly when a
# generated column appears in the USING clause of a join.
#
do_execsql_test gencol1-13.10 {
  CREATE TABLE t1(x, y AS(x+1));
  INSERT INTO t1 VALUES(10);
  SELECT y FROM t1 JOIN t1 USING (y,y);







|







338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
sqlite3 db :memory:
do_execsql_test gencol1-12.10 {
  CREATE TABLE t0 (c0, c1 NOT NULL AS (c0==0));
  INSERT INTO t0(c0) VALUES (0);
  PRAGMA integrity_check;
} {ok}

# 2019-12-09 bug report from Yongheng Chen
# Ensure that the SrcList_item.colUsed field is set correctly when a
# generated column appears in the USING clause of a join.
#
do_execsql_test gencol1-13.10 {
  CREATE TABLE t1(x, y AS(x+1));
  INSERT INTO t1 VALUES(10);
  SELECT y FROM t1 JOIN t1 USING (y,y);
364
365
366
367
368
369
370














371
372
373
do_execsql_test gencol1-13.21 {
  CREATE INDEX t1x ON t1(x);
  SELECT 123 FROM t1 JOIN t1 USING (x);
} {123}
do_execsql_test gencol1-13.22 {
  SELECT 456 FROM t1 JOIN t1 USING (x,x);
} {456}
















finish_test







>
>
>
>
>
>
>
>
>
>
>
>
>
>



364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
do_execsql_test gencol1-13.21 {
  CREATE INDEX t1x ON t1(x);
  SELECT 123 FROM t1 JOIN t1 USING (x);
} {123}
do_execsql_test gencol1-13.22 {
  SELECT 456 FROM t1 JOIN t1 USING (x,x);
} {456}

# 2019-12-14 ticket b439bfcfb7deedc6
#
sqlite3 db :memory:
do_execsql_test gencol1-14.10 {
  CREATE TABLE t0(c0 AS(1 >= 1), c1 UNIQUE AS(TYPEOF(c0)), c2);
  INSERT INTO t0 VALUES(0);
  REINDEX;
  SELECT * FROM t0;
} {1 integer 0}
do_catchsql_test gencol1-14.10 {
  INSERT INTO t0 VALUES(2);
} {1 {UNIQUE constraint failed: t0.c1}}



finish_test