SQLite

Check-in [13f6942eb0]
Login

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

Overview
Comment:Do not accidently truncate zeroblob values when doing an arithmetic operation. Fix for ticket [bb4bdb9f7f654b0bb9f34cfba].
Downloads: Tarball | ZIP archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: 13f6942eb0da2d92a0830f18640ce64208bd0cd6ff6d0c97e4a4c57ac3d65ba6
User & Date: drh 2019-01-25 20:09:04.290
Context
2019-01-26
15:40
Add the ".eqp trace" command to the CLI when using SQLITE_DEBUG, as a convenient shorthand for "PRAGMA vdbe_debug=ON" but with automatic indentation feature for program listings provided by the CLI. (check-in: 626502faa1 user: drh tags: trunk)
2019-01-25
20:09
Do not accidently truncate zeroblob values when doing an arithmetic operation. Fix for ticket [bb4bdb9f7f654b0bb9f34cfba]. (check-in: 13f6942eb0 user: drh tags: trunk)
19:29
Reinitialize debugging information on registers of a trigger prior to each invocation of the trigger. This prevents false-positives from the sqlite3VdbeMemAboutToChange() test logic. (check-in: 98b3b97573 user: drh tags: trunk)
Changes
Unified Diff Ignore Whitespace Patch
Changes to src/vdbe.c.
381
382
383
384
385
386
387

388
389
390
391
392
393
394
** interpret as a string if we want to).  Compute its corresponding
** numeric type, if has one.  Set the pMem->u.r and pMem->u.i fields
** accordingly.
*/
static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){
  assert( (pMem->flags & (MEM_Int|MEM_Real))==0 );
  assert( (pMem->flags & (MEM_Str|MEM_Blob))!=0 );

  if( sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc)==0 ){
    return 0;
  }
  if( sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc)==0 ){
    return MEM_Int;
  }
  return MEM_Real;







>







381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
** interpret as a string if we want to).  Compute its corresponding
** numeric type, if has one.  Set the pMem->u.r and pMem->u.i fields
** accordingly.
*/
static u16 SQLITE_NOINLINE computeNumericType(Mem *pMem){
  assert( (pMem->flags & (MEM_Int|MEM_Real))==0 );
  assert( (pMem->flags & (MEM_Str|MEM_Blob))!=0 );
  ExpandBlob(pMem);
  if( sqlite3AtoF(pMem->z, &pMem->u.r, pMem->n, pMem->enc)==0 ){
    return 0;
  }
  if( sqlite3Atoi64(pMem->z, &pMem->u.i, pMem->n, pMem->enc)==0 ){
    return MEM_Int;
  }
  return MEM_Real;
Changes to test/zeroblob.test.
311
312
313
314
315
316
317











318
319
320
  sqlite3_step $stmt
  set ret [sqlite3_column_int $stmt 0]
  sqlite3_reset $stmt
  set ret
} {1000}

sqlite3_finalize $stmt












test_restore_config_pagecache
finish_test







>
>
>
>
>
>
>
>
>
>
>



311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
  sqlite3_step $stmt
  set ret [sqlite3_column_int $stmt 0]
  sqlite3_reset $stmt
  set ret
} {1000}

sqlite3_finalize $stmt

# 2019-01-25 https://sqlite.org/src/tktview/bb4bdb9f7f654b0bb9f34cfbac
# Zeroblob truncated by an index on expression
#
do_execsql_test 13.100 {
  DROP TABLE IF EXISTS t1;
  CREATE TABLE t1(a,b,c);
  CREATE INDEX t1bbc ON t1(b, b+c);
  INSERT INTO t1(a,b,c) VALUES(1,zeroblob(8),3);
  SELECT a, quote(b), length(b), c FROM t1;
} {1 X'0000000000000000' 8 3}

test_restore_config_pagecache
finish_test