From 546f567f4e7e44f565315408756e77a94fe42082 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Fri, 4 Jan 2019 12:03:21 -0500 Subject: [PATCH 01/25] defer reading salt from header until key derivation is triggered --- CHANGELOG.md | 1 + src/crypto.c | 2 +- src/crypto.h | 2 +- src/crypto_impl.c | 18 ++++++++------ test/sqlcipher-core.test | 54 ++++++++++++++++++++++++++++++++++++++++ 5 files changed, 67 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c125a37..10dde16 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,6 +2,7 @@ All notable changes to this project will be documented in this file. ## [unreleased] - [unreleased] +- Defer reading salt from header until key derivation is triggered ## [4.0.1] - 2018-12-17 - Based on upstream SQLite 3.26.0 (addresses SQLite “Magellan” issue) diff --git a/src/crypto.c b/src/crypto.c index fab3362..6c027ca 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -651,7 +651,7 @@ int sqlite3CodecAttach(sqlite3* db, int nDb, const void *zKey, int nKey) { /* point the internal codec argument against the contet to be prepared */ CODEC_TRACE("sqlite3CodecAttach: calling sqlcipher_codec_ctx_init()\n"); - rc = sqlcipher_codec_ctx_init(&ctx, pDb, pDb->pBt->pBt->pPager, fd, zKey, nKey); + rc = sqlcipher_codec_ctx_init(&ctx, pDb, pDb->pBt->pBt->pPager, zKey, nKey); if(rc != SQLITE_OK) { /* initialization failed, do not attach potentially corrupted context */ diff --git a/src/crypto.h b/src/crypto.h index da64774..63f1121 100644 --- a/src/crypto.h +++ b/src/crypto.h @@ -205,7 +205,7 @@ void sqlcipher_init_memmethods(void); void sqlcipher_activate(void); void sqlcipher_deactivate(void); -int sqlcipher_codec_ctx_init(codec_ctx **, Db *, Pager *, sqlite3_file *, const void *, int); +int sqlcipher_codec_ctx_init(codec_ctx **, Db *, Pager *, const void *, int); void sqlcipher_codec_ctx_free(codec_ctx **); int sqlcipher_codec_key_derive(codec_ctx *); int sqlcipher_codec_key_copy(codec_ctx *, int); diff --git a/src/crypto_impl.c b/src/crypto_impl.c index c204293..84817cd 100644 --- a/src/crypto_impl.c +++ b/src/crypto_impl.c @@ -814,7 +814,7 @@ int sqlcipher_get_mem_security() { } -int sqlcipher_codec_ctx_init(codec_ctx **iCtx, Db *pDb, Pager *pPager, sqlite3_file *fd, const void *zKey, int nKey) { +int sqlcipher_codec_ctx_init(codec_ctx **iCtx, Db *pDb, Pager *pPager, const void *zKey, int nKey) { int rc; codec_ctx *ctx; @@ -846,11 +846,8 @@ int sqlcipher_codec_ctx_init(codec_ctx **iCtx, Db *pDb, Pager *pPager, sqlite3_f /* setup default flags */ ctx->flags = default_flags; - /* read salt from header, if present */ - CODEC_TRACE("sqlcipher_codec_ctx_init: reading file header\n"); - if(fd == NULL || sqlite3OsRead(fd, ctx->kdf_salt, ctx->kdf_salt_sz, 0) != SQLITE_OK) { - ctx->need_kdf_salt = 1; - } + /* defer attempt to read KDF salt until first use */ + ctx->need_kdf_salt = 1; /* setup the crypto provider */ CODEC_TRACE("sqlcipher_codec_ctx_init: allocating provider\n"); @@ -1094,9 +1091,14 @@ static int sqlcipher_cipher_ctx_key_derive(codec_ctx *ctx, cipher_ctx *c_ctx) { if(c_ctx->pass && c_ctx->pass_sz) { // if pass is not null - if(ctx->need_kdf_salt) { - if(ctx->provider->random(ctx->provider_ctx, ctx->kdf_salt, ctx->kdf_salt_sz) != SQLITE_OK) return SQLITE_ERROR; + sqlite3_file *fd = sqlite3PagerFile(ctx->pBt->pBt->pPager); + /* read salt from header, if present, otherwise generate a new random salt */ + CODEC_TRACE("sqlcipher_cipher_ctx_key_derive: obtaining salt\n"); + if(fd == NULL || fd->pMethods == 0 || sqlite3OsRead(fd, ctx->kdf_salt, ctx->kdf_salt_sz, 0) != SQLITE_OK) { + CODEC_TRACE("sqlcipher_cipher_ctx_key_derive: unable to read salt from file header, generating random\n"); + if(ctx->provider->random(ctx->provider_ctx, ctx->kdf_salt, ctx->kdf_salt_sz) != SQLITE_OK) return SQLITE_ERROR; + } ctx->need_kdf_salt = 0; } if (c_ctx->pass_sz == ((ctx->key_sz * 2) + 3) && sqlite3StrNICmp((const char *)c_ctx->pass ,"x'", 2) == 0 && cipher_isHex(c_ctx->pass + 2, ctx->key_sz * 2)) { diff --git a/test/sqlcipher-core.test b/test/sqlcipher-core.test index 9fbcdeb..d548c23 100644 --- a/test/sqlcipher-core.test +++ b/test/sqlcipher-core.test @@ -711,4 +711,58 @@ do_test verify-memory-security { db close file delete -force test.db +# create two new database files, write to each +# and verify that they have different (i.e. random) +# salt values +do_test test-random-salt { + sqlite_orig db test.db + sqlite_orig db2 test2.db + execsql { + PRAGMA key = 'test'; + CREATE TABLE t1(a,b); + INSERT INTO t1(a,b) VALUES (1,2); + } + execsql { + PRAGMA key = 'test'; + CREATE TABLE t1(a,b); + INSERT INTO t1(a,b) VALUES (1,2); + } db2 + db close + db2 close + string equal [hexio_read test.db 0 16] [hexio_read test2.db 0 16] +} {0} +file delete -force test.db +file delete -force test2.db + +# test scenario where multiple handles are opened +# to a file that does not exist, where both handles +# use the same key +do_test multiple-handles-same-key-and-salt { + sqlite_orig db test.db + sqlite_orig dba test.db + + execsql { + PRAGMA key = 'testkey'; + } + execsql { + PRAGMA key = 'testkey'; + } dba + + execsql { + CREATE TABLE t1(a,b); + INSERT INTO t1 VALUES(1,2); + } + + execsql { + SELECT count(*) FROM t1; + } + execsql { + SELECT count(*) FROM t1; + } dba + +} {1} +db close +dba close +file delete -force test.db + finish_test From addd2519d240bee9f09690cbef3342c7bb0d009f Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Fri, 4 Jan 2019 12:06:49 -0500 Subject: [PATCH 02/25] minor comment cleanup --- src/crypto.c | 10 +++++----- src/crypto_impl.c | 6 +++--- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/crypto.c b/src/crypto.c index 6c027ca..392f994 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -180,7 +180,7 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef }else if( sqlite3StrICmp(zLeft,"cipher_default_kdf_iter")==0 ){ if( zRight ) { - sqlcipher_set_default_kdf_iter(atoi(zRight)); // change default KDF iterations + sqlcipher_set_default_kdf_iter(atoi(zRight)); /* change default KDF iterations */ } else { char *kdf_iter = sqlite3_mprintf("%d", sqlcipher_get_default_kdf_iter()); codec_vdbe_return_string(pParse, "cipher_default_kdf_iter", kdf_iter, P4_DYNAMIC); @@ -189,7 +189,7 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef if( sqlite3StrICmp(zLeft, "kdf_iter")==0 ){ if(ctx) { if( zRight ) { - sqlcipher_codec_ctx_set_kdf_iter(ctx, atoi(zRight)); // change of RW PBKDF2 iteration + sqlcipher_codec_ctx_set_kdf_iter(ctx, atoi(zRight)); /* change of RW PBKDF2 iteration */ } else { char *kdf_iter = sqlite3_mprintf("%d", sqlcipher_codec_ctx_get_kdf_iter(ctx)); codec_vdbe_return_string(pParse, "kdf_iter", kdf_iter, P4_DYNAMIC); @@ -199,7 +199,7 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef if( sqlite3StrICmp(zLeft, "fast_kdf_iter")==0){ if(ctx) { if( zRight ) { - sqlcipher_codec_ctx_set_fast_kdf_iter(ctx, atoi(zRight)); // change of RW PBKDF2 iteration + sqlcipher_codec_ctx_set_fast_kdf_iter(ctx, atoi(zRight)); /* change of RW PBKDF2 iteration */ } else { char *fast_kdf_iter = sqlite3_mprintf("%d", sqlcipher_codec_ctx_get_fast_kdf_iter(ctx)); codec_vdbe_return_string(pParse, "fast_kdf_iter", fast_kdf_iter, P4_DYNAMIC); @@ -258,7 +258,7 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef if( sqlite3StrICmp(zLeft,"cipher_hmac_pgno")==0 ){ if(ctx) { if(zRight) { - // clear both pgno endian flags + /* clear both pgno endian flags */ if(sqlite3StrICmp(zRight, "le") == 0) { sqlcipher_codec_ctx_unset_flag(ctx, CIPHER_FLAG_BE_PGNO); sqlcipher_codec_ctx_set_flag(ctx, CIPHER_FLAG_LE_PGNO); @@ -616,7 +616,7 @@ static void* sqlite3Codec(void *iCtx, void *data, Pgno pgno, int mode) { static void sqlite3FreeCodecArg(void *pCodecArg) { codec_ctx *ctx = (codec_ctx *) pCodecArg; if(pCodecArg == NULL) return; - sqlcipher_codec_ctx_free(&ctx); // wipe and free allocated memory for the context + sqlcipher_codec_ctx_free(&ctx); /* wipe and free allocated memory for the context */ sqlcipher_deactivate(); /* cleanup related structures, OpenSSL etc, when codec is detatched */ } diff --git a/src/crypto_impl.c b/src/crypto_impl.c index 84817cd..e5f22b8 100644 --- a/src/crypto_impl.c +++ b/src/crypto_impl.c @@ -504,10 +504,10 @@ static int sqlcipher_cipher_ctx_copy(codec_ctx *ctx, cipher_ctx *target, cipher_ sqlcipher_free(target->keyspec, ctx->keyspec_sz); memcpy(target, source, sizeof(cipher_ctx)); - target->key = key; //restore pointer to previously allocated key data + target->key = key; /* restore pointer to previously allocated key data */ memcpy(target->key, source->key, ctx->key_sz); - target->hmac_key = hmac_key; //restore pointer to previously allocated hmac key data + target->hmac_key = hmac_key; /* restore pointer to previously allocated hmac key data */ memcpy(target->hmac_key, source->hmac_key, ctx->key_sz); if(source->pass && source->pass_sz) { @@ -1090,7 +1090,7 @@ static int sqlcipher_cipher_ctx_key_derive(codec_ctx *ctx, cipher_ctx *c_ctx) { ctx->hmac_kdf_salt, c_ctx->fast_kdf_iter, ctx->key_sz); - if(c_ctx->pass && c_ctx->pass_sz) { // if pass is not null + if(c_ctx->pass && c_ctx->pass_sz) { /* if pass is not null */ if(ctx->need_kdf_salt) { sqlite3_file *fd = sqlite3PagerFile(ctx->pBt->pBt->pPager); /* read salt from header, if present, otherwise generate a new random salt */ From 47acb89a4863b57f144aec8fcef7c5b3c209568a Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Fri, 4 Jan 2019 12:29:58 -0500 Subject: [PATCH 03/25] add usage note to sqlite3_rekey in header per #301 --- src/sqlite.h.in | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 85ef363..9850335 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -5539,6 +5539,22 @@ int sqlite3_key_v2( ** The code to implement this API is not available in the public release ** of SQLite. */ +/* BEGIN SQLCIPHER + SQLCipher usage note: + + If the current database is plaintext SQLCipher will NOT encrypt it. + If the current database is encrypted and pNew==0 or nNew==0, SQLCipher + will NOT decrypt it. + + This routine will ONLY work on an already encrypted database in order + to change the key. + + Conversion from plaintext-to-encrypted or encrypted-to-plaintext should + use an ATTACHed database and the sqlcipher_export() convenience function + as per the SQLCipher Documentation. + + END SQLCIPHER +*/ int sqlite3_rekey( sqlite3 *db, /* Database to be rekeyed */ const void *pKey, int nKey /* The new key */ From b9e1e5ee90961ace1085f7058229b6ff6833174f Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Fri, 4 Jan 2019 14:54:23 -0500 Subject: [PATCH 04/25] updates to compatibilty and contribution sections in readme per issue #300 --- README.md | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 28bf75d..3d6e594 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ SQLCipher extends the [SQLite](https://www.sqlite.org) database library to add security enhancements that make it more suitable for encrypted local data storage such as on-the-fly encryption, tamper evidence, and key derivation. Based on SQLite, SQLCipher closely tracks SQLite and periodically integrates stable SQLite release features. -SQLCipher is maintained by Zetetic, LLC, the official site can be found [here](https://www.zetetic.net/sqlcipher/). +SQLCipher is maintained by Zetetic, LLC, and additional information and documentation is available on the official [SQLCipher site](https://www.zetetic.net/sqlcipher/). ## Features @@ -13,9 +13,15 @@ SQLCipher is maintained by Zetetic, LLC, the official site can be found [here](h - Algorithms provided by the peer reviewed OpenSSL crypto library. - Configurable crypto providers +## Compatibility + +SQLCipher maintains database format compatibility within the same major version number so an application on any platform can open databases created by any other application provided the major version of SQLCipher is the same between them. However, major version updates (e.g. from 3.x to 4.x) often include changes to default settings. This means that newer major versions of SQLCipher will not open databases created by older versions without using special settings. For example, SQLCipher 4 introduces many new performance and security enhancements. The new default algorithms, increased KDF iterations, and larger page size mean that SQLCipher 4 will not open databases created by SQLCipher 1.x, 2.x, or 3.x by default. Instead, an application would either need to migrate the older databases to use the new format or enable a special backwards-compatibility mode. The available options are described in SQLCipher's [upgrade documentation](https://discuss.zetetic.net/t/upgrading-to-sqlcipher-4/3283). + +SQLCipher is also compatible with standard SQLite databases. When a key is not provided, SQLCipher will behave just like the standard SQLite library. It is also possible to convert from a plaintext database (standard SQLite) to an encrypted SQLCipher database using [ATTACH and the sqlcipher_export() convenience function](https://discuss.zetetic.net/t/how-to-encrypt-a-plaintext-sqlite-database-to-use-sqlcipher-and-avoid-file-is-encrypted-or-is-not-a-database-errors/868). + ## Contributions -We welcome contributions, to contribute to SQLCipher, a [contributor agreement](https://www.zetetic.net/contributions/) needs to be submitted. All submissions should be based on the `prerelease` branch. +The SQLCipher team welcomes contributions to the core library. All contributions including pull requests and patches should be based on the `prerelease` branch, and must be accompanied by a [contributor agreement](https://www.zetetic.net/contributions/). For large changes we strongly encourage [discussion](https://discuss.zetetic.net/c/sqlcipher) of the proposed change prior to development and submission. ## Compiling From e72b34b24bccb9fa134ed2650f0c72c9a423031f Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Tue, 15 Jan 2019 10:32:27 -0500 Subject: [PATCH 05/25] verify salt values for attach behavior tests --- test/sqlcipher-core.test | 57 ++++++++++++++++++++++++++++++++-------- 1 file changed, 46 insertions(+), 11 deletions(-) diff --git a/test/sqlcipher-core.test b/test/sqlcipher-core.test index d548c23..90bb3d3 100644 --- a/test/sqlcipher-core.test +++ b/test/sqlcipher-core.test @@ -184,11 +184,43 @@ do_test attach-database-with-default-key { INSERT INTO t2 VALUES ('test1', 'test2'); } db2 - catchsql { + lappend rc [catchsql { ATTACH 'test.db' AS db; - } db2 - -} {1 {file is not a database}} + } db2] + + lappend rc [string equal [hexio_read test.db 0 16] [hexio_read test2.db 0 16]] + +} {{1 {file is not a database}} 0} +db2 close +file delete -force test.db +file delete -force test2.db + +# attach an empty encrypted database +# without specifying key, verify the database has the same +# salt and as the original +setup test.db "'testkey'" +do_test attach-empty-database-with-default-key { + sqlite_orig db test.db + set rc {} + + execsql { + PRAGMA key='testkey'; + INSERT INTO t1(a,b) values (1,2); + ATTACH DATABASE 'test2.db' AS test; + CREATE TABLE test.t1(a,b); + INSERT INTO test.t1 SELECT * FROM t1; + DETACH DATABASE test; + } + + sqlite_orig db2 test2.db + + lappend rc [execsql { + PRAGMA key='testkey'; + SELECT count(*) FROM t1; + } db2] + lappend rc [string equal [hexio_read test.db 0 16] [hexio_read test2.db 0 16]] +} {2 1} +db close db2 close file delete -force test.db file delete -force test2.db @@ -196,9 +228,8 @@ file delete -force test2.db # attach an encrypted database # without specifying key, verify it attaches # correctly when PRAGMA cipher_store_pass = 1 -# is set. +# is set do_test attach-database-with-default-key-using-cipher-store-pass { - sqlite_orig db1 test.db execsql { PRAGMA key = 'testkey'; @@ -238,10 +269,13 @@ file delete -force test2.db # attach an encrypted database # where both database have the same -# key explicitly +# key explicitly and verify they have different +# salt values setup test.db "'testkey'" do_test attach-database-with-same-key { sqlite_orig db2 test2.db + + set rc {} execsql { PRAGMA key = 'testkey'; @@ -249,13 +283,14 @@ do_test attach-database-with-same-key { INSERT INTO t2 VALUES ('test1', 'test2'); } db2 - execsql { + lappend rc [execsql { SELECT count(*) FROM t2; ATTACH 'test.db' AS db KEY 'testkey'; SELECT count(*) FROM db.t1; - } db2 - -} {1 1} + } db2] + + lappend rc [string equal [hexio_read test.db 0 16] [hexio_read test2.db 0 16]] +} {{1 1} 0} db2 close file delete -force test.db file delete -force test2.db From 42e655bf35a4e84e21392210f9e8c8d463d440db Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Tue, 15 Jan 2019 13:15:51 -0500 Subject: [PATCH 06/25] normalize attach behavior when key is not yet derived --- src/crypto.c | 8 ++++-- test/sqlcipher-core.test | 62 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 3 deletions(-) diff --git a/src/crypto.c b/src/crypto.c index 392f994..69a9853 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -813,10 +813,12 @@ void sqlite3CodecGetKey(sqlite3* db, int nDb, void **zKey, int *nKey) { codec_ctx *ctx = (codec_ctx*) sqlite3PagerGetCodec(pDb->pBt->pBt->pPager); if(ctx) { - if(sqlcipher_codec_get_store_pass(ctx) == 1) { + /* pass back the keyspec from the codec, unless PRAGMA cipher_store_pass + is set or keyspec has not yet been derived, in which case pass + back the password key material */ + sqlcipher_codec_get_keyspec(ctx, zKey, nKey); + if(sqlcipher_codec_get_store_pass(ctx) == 1 || *zKey == NULL) { sqlcipher_codec_get_pass(ctx, zKey, nKey); - } else { - sqlcipher_codec_get_keyspec(ctx, zKey, nKey); } } else { *zKey = NULL; diff --git a/test/sqlcipher-core.test b/test/sqlcipher-core.test index 90bb3d3..224bd59 100644 --- a/test/sqlcipher-core.test +++ b/test/sqlcipher-core.test @@ -225,6 +225,68 @@ db2 close file delete -force test.db file delete -force test2.db +# attach an empty encrypted database as the first op +# on a keyed database and verify different +# salts but same keys (because derivation of the key spec +# has not occured yet) +setup test.db "'testkey'" +do_test attach-empty-database-with-default-key-first-op { + sqlite_orig db test.db + set rc {} + + execsql { + PRAGMA key='testkey'; + ATTACH DATABASE 'test2.db' AS test; + CREATE TABLE test.t1(a,b); + INSERT INTO test.t1 SELECT * FROM t1; + DETACH DATABASE test; + } + + sqlite_orig db2 test2.db + + lappend rc [execsql { + PRAGMA key='testkey'; + SELECT count(*) FROM t1; + } db2] + + lappend rc [string equal [hexio_read test.db 0 16] [hexio_read test2.db 0 16]] +} {1 0} +db close +db2 close +file delete -force test.db +file delete -force test2.db + +# attach an empty encrypted database +# on a keyed database when PRAGMA cipher_store_pass = 1 +# and verify different salts +setup test.db "'testkey'" +do_test attach-empty-database-with-cipher-store-pass { + sqlite_orig db test.db + set rc {} + + execsql { + PRAGMA key='testkey'; + PRAGMA cipher_store_pass = 1; + INSERT INTO t1(a,b) VALUES (1,2); + ATTACH DATABASE 'test2.db' AS test; + CREATE TABLE test.t1(a,b); + INSERT INTO test.t1 SELECT * FROM t1; + DETACH DATABASE test; + } + + sqlite_orig db2 test2.db + + lappend rc [execsql { + PRAGMA key='testkey'; + SELECT count(*) FROM t1; + } db2] + lappend rc [string equal [hexio_read test.db 0 16] [hexio_read test2.db 0 16]] +} {2 0} +db close +db2 close +file delete -force test.db +file delete -force test2.db + # attach an encrypted database # without specifying key, verify it attaches # correctly when PRAGMA cipher_store_pass = 1 From 034480aa7632e65817eed8cbb766d6f0d7ee5da9 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Tue, 15 Jan 2019 13:38:44 -0500 Subject: [PATCH 07/25] adds PRAGMA cipher_settings to query current database codec settings --- src/crypto.c | 51 +++++++++++++++++++++++++++++++++++++ test/sqlcipher-pragmas.test | 22 ++++++++++++++++ 2 files changed, 73 insertions(+) diff --git a/src/crypto.c b/src/crypto.c index 69a9853..2e5b8ce 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -534,6 +534,57 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef char *on = sqlite3_mprintf("%d", sqlcipher_get_mem_security()); codec_vdbe_return_string(pParse, "cipher_memory_security", on, P4_DYNAMIC); } + }else + if( sqlite3StrICmp(zLeft,"cipher_settings")==0 ){ + if(ctx) { + int algorithm; + char *pragma; + pragma = sqlite3_mprintf("PRAGMA kdf_iter = %d;", sqlcipher_codec_ctx_get_kdf_iter(ctx)); + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + pragma = sqlite3_mprintf("PRAGMA fast_kdf_iter = %d;", sqlcipher_codec_ctx_get_fast_kdf_iter(ctx)); + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + pragma = sqlite3_mprintf("PRAGMA cipher_page_size = %d;", sqlcipher_codec_ctx_get_pagesize(ctx)); + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + pragma = sqlite3_mprintf("PRAGMA cipher_use_hmac = %d;", sqlcipher_codec_ctx_get_use_hmac(ctx)); + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + if(sqlcipher_codec_ctx_get_flag(ctx, CIPHER_FLAG_LE_PGNO)) { + codec_vdbe_return_string(pParse, "pragma", "PRAGMA cipher_hmac_pgno = le;", P4_TRANSIENT); + } else if(sqlcipher_codec_ctx_get_flag(ctx, CIPHER_FLAG_BE_PGNO)) { + codec_vdbe_return_string(pParse, "pragma", "PRAGMA cipher_hmac_pgno = be;", P4_TRANSIENT); + } else { + codec_vdbe_return_string(pParse, "pragma", "PRAGMA cipher_hmac_pgno = native;", P4_TRANSIENT); + } + + pragma = sqlite3_mprintf("PRAGMA cipher_hmac_salt_mask = %02x;", sqlcipher_get_hmac_salt_mask()); + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + pragma = sqlite3_mprintf("PRAGMA cipher_plaintext_header_size = %d;", sqlcipher_codec_ctx_get_plaintext_header_size(ctx)); + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + algorithm = sqlcipher_codec_ctx_get_hmac_algorithm(ctx); + pragma = NULL; + if(algorithm == SQLCIPHER_HMAC_SHA1) { + pragma = sqlite3_mprintf("PRAGMA cipher_hmac_algorithm = %s;", SQLCIPHER_HMAC_SHA1_LABEL); + } else if(algorithm == SQLCIPHER_HMAC_SHA256) { + pragma = sqlite3_mprintf("PRAGMA cipher_hmac_algorithm = %s;", SQLCIPHER_HMAC_SHA256_LABEL); + } else if(algorithm == SQLCIPHER_HMAC_SHA512) { + pragma = sqlite3_mprintf("PRAGMA cipher_hmac_algorithm = %s;", SQLCIPHER_HMAC_SHA512_LABEL); + } + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + algorithm = sqlcipher_codec_ctx_get_kdf_algorithm(ctx); + pragma = NULL; + if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA1) { + pragma = sqlite3_mprintf("PRAGMA cipher_kdf_algorithm = %s;", SQLCIPHER_PBKDF2_HMAC_SHA1_LABEL); + } else if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA256) { + pragma = sqlite3_mprintf("PRAGMA cipher_kdf_algorithm = %s;", SQLCIPHER_PBKDF2_HMAC_SHA256_LABEL); + } else if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA512) { + pragma = sqlite3_mprintf("PRAGMA cipher_kdf_algorithm = %s;", SQLCIPHER_PBKDF2_HMAC_SHA512_LABEL); + } + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + } }else { return 0; } diff --git a/test/sqlcipher-pragmas.test b/test/sqlcipher-pragmas.test index e1bd946..2eecdbd 100644 --- a/test/sqlcipher-pragmas.test +++ b/test/sqlcipher-pragmas.test @@ -245,6 +245,7 @@ do_test verify-pragma-hmac-salt-mask-reports-value-changed { PRAGMA key = 'test'; PRAGMA cipher_hmac_salt_mask = "x'11'"; PRAGMA cipher_hmac_salt_mask; + PRAGMA cipher_hmac_salt_mask = "x'3a'"; } } {11} db close @@ -376,4 +377,25 @@ if_built_with_commoncrypto verify-default-cipher { db close file delete -force test.db +do_test verify-cipher_settings_default { + sqlite_orig db test.db + execsql { + PRAGMA key = 'test'; + PRAGMA cipher_settings; + } +} {{PRAGMA kdf_iter = 256000;} {PRAGMA fast_kdf_iter = 2;} {PRAGMA cipher_page_size = 4096;} {PRAGMA cipher_use_hmac = 1;} {PRAGMA cipher_hmac_pgno = le;} {PRAGMA cipher_hmac_salt_mask = 3a;} {PRAGMA cipher_plaintext_header_size = 0;} {PRAGMA cipher_hmac_algorithm = HMAC_SHA512;} {PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA512;}} +db close +file delete -force test.db + +do_test verify-cipher_settings_v1 { + sqlite_orig db test.db + execsql { + PRAGMA key = 'test'; + PRAGMA cipher_compatibility = 1; + PRAGMA cipher_settings; + } +} {{PRAGMA kdf_iter = 4000;} {PRAGMA fast_kdf_iter = 2;} {PRAGMA cipher_page_size = 1024;} {PRAGMA cipher_use_hmac = 0;} {PRAGMA cipher_hmac_pgno = le;} {PRAGMA cipher_hmac_salt_mask = 3a;} {PRAGMA cipher_plaintext_header_size = 0;} {PRAGMA cipher_hmac_algorithm = HMAC_SHA1;} {PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA1;}} +db close +file delete -force test.db + finish_test From fe0ee2631cd72b3730bee36f3c0ab3edbca01962 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Tue, 15 Jan 2019 13:45:41 -0500 Subject: [PATCH 08/25] adds recent updates to CHANGELOG.md --- CHANGELOG.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 10dde16..4c8c381 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,9 @@ All notable changes to this project will be documented in this file. ## [unreleased] - [unreleased] - Defer reading salt from header until key derivation is triggered +- Clarify usage of sqlite3_rekey for plaintext databases in header +- Normalize attach behavior when key is not yet derived +- Adds PRAGMA cipher_settings to query current database codec settings ## [4.0.1] - 2018-12-17 - Based on upstream SQLite 3.26.0 (addresses SQLite “Magellan” issue) From e9b82ec35ca1594ed17b93debbc8642be7fe12be Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Tue, 15 Jan 2019 14:27:08 -0500 Subject: [PATCH 09/25] add test explicitly showing zero cipher_salt on first operation --- test/sqlcipher-plaintext-header.test | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/test/sqlcipher-plaintext-header.test b/test/sqlcipher-plaintext-header.test index 431b275..fd9876e 100644 --- a/test/sqlcipher-plaintext-header.test +++ b/test/sqlcipher-plaintext-header.test @@ -430,5 +430,28 @@ do_test test-plaintext-header-migrate-journal-wal-string-key-random-salt { db close file delete -force test.db +# when cipher_salt is the first statement the values are zeros +# after the databse is first used and key derivation occurs it will change +do_test plaintext-header-size-salt-first-op { + set rc {} + sqlite_orig db test.db + set salt1 [execsql { + PRAGMA key = 'test'; + PRAGMA cipher_plaintext_header_size = 16; + PRAGMA cipher_salt; + }] + + set salt2 [execsql { + CREATE TABLE t1(a,b); + INSERT INTO t1(a,b) VALUES (1,2); + PRAGMA cipher_salt; + }] + + lappend rc $salt1 + lappend rc [string equal $salt1 "00000000000000000000000000000000"] + lappend rc [string equal $salt2 "00000000000000000000000000000000"] +} {00000000000000000000000000000000 1 0} +db close +file delete -force test.db finish_test From fb3a1960df36f157acb92b1b9328a710faf6b568 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Wed, 16 Jan 2019 12:25:38 -0500 Subject: [PATCH 10/25] deprecates cipher_hmac_pgno and cipher_hmac_salt_mask --- CHANGELOG.md | 1 + src/crypto.c | 22 +++++++++------------- test/sqlcipher-compatibility.test | 4 ++-- test/sqlcipher-pragmas.test | 8 ++++---- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 4c8c381..94cf315 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. - Clarify usage of sqlite3_rekey for plaintext databases in header - Normalize attach behavior when key is not yet derived - Adds PRAGMA cipher_settings to query current database codec settings +- PRAGMA cipher_hmac_pgno and cipher_hmac_salt_mask are now deprecated ## [4.0.1] - 2018-12-17 - Based on upstream SQLite 3.26.0 (addresses SQLite “Magellan” issue) diff --git a/src/crypto.c b/src/crypto.c index 2e5b8ce..002c525 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -258,6 +258,7 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef if( sqlite3StrICmp(zLeft,"cipher_hmac_pgno")==0 ){ if(ctx) { if(zRight) { + char *deprecation = "PRAGMA cipher_hmac_pgno is deprecated, please remove from use"; /* clear both pgno endian flags */ if(sqlite3StrICmp(zRight, "le") == 0) { sqlcipher_codec_ctx_unset_flag(ctx, CIPHER_FLAG_BE_PGNO); @@ -269,6 +270,9 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef sqlcipher_codec_ctx_unset_flag(ctx, CIPHER_FLAG_LE_PGNO); sqlcipher_codec_ctx_unset_flag(ctx, CIPHER_FLAG_BE_PGNO); } + codec_vdbe_return_string(pParse, "cipher_hmac_pgno", deprecation, P4_TRANSIENT); + sqlite3_log(SQLITE_WARNING, deprecation); + } else { if(sqlcipher_codec_ctx_get_flag(ctx, CIPHER_FLAG_LE_PGNO)) { codec_vdbe_return_string(pParse, "cipher_hmac_pgno", "le", P4_TRANSIENT); @@ -283,15 +287,18 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef if( sqlite3StrICmp(zLeft,"cipher_hmac_salt_mask")==0 ){ if(ctx) { if(zRight) { + char *deprecation = "PRAGMA cipher_hmac_salt_mask is deprecated, please remove from use"; if (sqlite3StrNICmp(zRight ,"x'", 2) == 0 && sqlite3Strlen30(zRight) == 5) { unsigned char mask = 0; const unsigned char *hex = (const unsigned char *)zRight+2; cipher_hex2bin(hex,2,&mask); sqlcipher_set_hmac_salt_mask(mask); } + codec_vdbe_return_string(pParse, "cipher_hmac_salt_mask", deprecation, P4_TRANSIENT); + sqlite3_log(SQLITE_WARNING, deprecation); } else { - char *hmac_salt_mask = sqlite3_mprintf("%02x", sqlcipher_get_hmac_salt_mask()); - codec_vdbe_return_string(pParse, "cipher_hmac_salt_mask", hmac_salt_mask, P4_DYNAMIC); + char *hmac_salt_mask = sqlite3_mprintf("%02x", sqlcipher_get_hmac_salt_mask()); + codec_vdbe_return_string(pParse, "cipher_hmac_salt_mask", hmac_salt_mask, P4_DYNAMIC); } } }else @@ -548,17 +555,6 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef pragma = sqlite3_mprintf("PRAGMA cipher_use_hmac = %d;", sqlcipher_codec_ctx_get_use_hmac(ctx)); codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); - if(sqlcipher_codec_ctx_get_flag(ctx, CIPHER_FLAG_LE_PGNO)) { - codec_vdbe_return_string(pParse, "pragma", "PRAGMA cipher_hmac_pgno = le;", P4_TRANSIENT); - } else if(sqlcipher_codec_ctx_get_flag(ctx, CIPHER_FLAG_BE_PGNO)) { - codec_vdbe_return_string(pParse, "pragma", "PRAGMA cipher_hmac_pgno = be;", P4_TRANSIENT); - } else { - codec_vdbe_return_string(pParse, "pragma", "PRAGMA cipher_hmac_pgno = native;", P4_TRANSIENT); - } - - pragma = sqlite3_mprintf("PRAGMA cipher_hmac_salt_mask = %02x;", sqlcipher_get_hmac_salt_mask()); - codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); - pragma = sqlite3_mprintf("PRAGMA cipher_plaintext_header_size = %d;", sqlcipher_codec_ctx_get_plaintext_header_size(ctx)); codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); diff --git a/test/sqlcipher-compatibility.test b/test/sqlcipher-compatibility.test index 5276231..9d5c85e 100644 --- a/test/sqlcipher-compatibility.test +++ b/test/sqlcipher-compatibility.test @@ -884,7 +884,7 @@ do_test open-2.0-be-database { SELECT count(*) FROM t1; SELECT distinct * FROM t1; } -} {78536 1 1 one one 1 2 one two} +} {{PRAGMA cipher_hmac_pgno is deprecated, please remove from use} 78536 1 1 one one 1 2 one two} db close # open a 2.0 database with big-endian hmac page numbers @@ -936,7 +936,7 @@ do_test open-2.0-beta-database { SELECT count(*) FROM t1; SELECT distinct * FROM t1; } -} {38768 test-0-0 test-0-1 test-1-0 test-1-1} +} {{PRAGMA cipher_hmac_salt_mask is deprecated, please remove from use} 38768 test-0-0 test-0-1 test-1-0 test-1-1} db close # open a 2.0 beta database diff --git a/test/sqlcipher-pragmas.test b/test/sqlcipher-pragmas.test index 2eecdbd..63b14a2 100644 --- a/test/sqlcipher-pragmas.test +++ b/test/sqlcipher-pragmas.test @@ -247,7 +247,7 @@ do_test verify-pragma-hmac-salt-mask-reports-value-changed { PRAGMA cipher_hmac_salt_mask; PRAGMA cipher_hmac_salt_mask = "x'3a'"; } -} {11} +} {{PRAGMA cipher_hmac_salt_mask is deprecated, please remove from use} 11 {PRAGMA cipher_hmac_salt_mask is deprecated, please remove from use}} db close file delete -force test.db @@ -275,7 +275,7 @@ do_test verify-pragma-hmac-pgno-reports-value-changed { PRAGMA cipher_hmac_pgno = le; PRAGMA cipher_hmac_pgno; } -} {be native le} +} {{PRAGMA cipher_hmac_pgno is deprecated, please remove from use} be {PRAGMA cipher_hmac_pgno is deprecated, please remove from use} native {PRAGMA cipher_hmac_pgno is deprecated, please remove from use} le} db close file delete -force test.db @@ -383,7 +383,7 @@ do_test verify-cipher_settings_default { PRAGMA key = 'test'; PRAGMA cipher_settings; } -} {{PRAGMA kdf_iter = 256000;} {PRAGMA fast_kdf_iter = 2;} {PRAGMA cipher_page_size = 4096;} {PRAGMA cipher_use_hmac = 1;} {PRAGMA cipher_hmac_pgno = le;} {PRAGMA cipher_hmac_salt_mask = 3a;} {PRAGMA cipher_plaintext_header_size = 0;} {PRAGMA cipher_hmac_algorithm = HMAC_SHA512;} {PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA512;}} +} {{PRAGMA kdf_iter = 256000;} {PRAGMA fast_kdf_iter = 2;} {PRAGMA cipher_page_size = 4096;} {PRAGMA cipher_use_hmac = 1;} {PRAGMA cipher_plaintext_header_size = 0;} {PRAGMA cipher_hmac_algorithm = HMAC_SHA512;} {PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA512;}} db close file delete -force test.db @@ -394,7 +394,7 @@ do_test verify-cipher_settings_v1 { PRAGMA cipher_compatibility = 1; PRAGMA cipher_settings; } -} {{PRAGMA kdf_iter = 4000;} {PRAGMA fast_kdf_iter = 2;} {PRAGMA cipher_page_size = 1024;} {PRAGMA cipher_use_hmac = 0;} {PRAGMA cipher_hmac_pgno = le;} {PRAGMA cipher_hmac_salt_mask = 3a;} {PRAGMA cipher_plaintext_header_size = 0;} {PRAGMA cipher_hmac_algorithm = HMAC_SHA1;} {PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA1;}} +} {{PRAGMA kdf_iter = 4000;} {PRAGMA fast_kdf_iter = 2;} {PRAGMA cipher_page_size = 1024;} {PRAGMA cipher_use_hmac = 0;} {PRAGMA cipher_plaintext_header_size = 0;} {PRAGMA cipher_hmac_algorithm = HMAC_SHA1;} {PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA1;}} db close file delete -force test.db From 02f4a0086bddb338b7138a3b9162043d4873937b Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Wed, 16 Jan 2019 13:03:47 -0500 Subject: [PATCH 11/25] PRAGMA cipher_default_settings queries current default SQLCipher options --- CHANGELOG.md | 1 + src/crypto.c | 42 +++++++++++++++++++++++++++++++++++++ test/sqlcipher-pragmas.test | 22 +++++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 94cf315..a16fcee 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ All notable changes to this project will be documented in this file. - Clarify usage of sqlite3_rekey for plaintext databases in header - Normalize attach behavior when key is not yet derived - Adds PRAGMA cipher_settings to query current database codec settings +- Adds PRAGMA cipher_default_settings to query current default SQLCipher options - PRAGMA cipher_hmac_pgno and cipher_hmac_salt_mask are now deprecated ## [4.0.1] - 2018-12-17 diff --git a/src/crypto.c b/src/crypto.c index 002c525..1513f1b 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -546,12 +546,16 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef if(ctx) { int algorithm; char *pragma; + pragma = sqlite3_mprintf("PRAGMA kdf_iter = %d;", sqlcipher_codec_ctx_get_kdf_iter(ctx)); codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + pragma = sqlite3_mprintf("PRAGMA fast_kdf_iter = %d;", sqlcipher_codec_ctx_get_fast_kdf_iter(ctx)); codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + pragma = sqlite3_mprintf("PRAGMA cipher_page_size = %d;", sqlcipher_codec_ctx_get_pagesize(ctx)); codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + pragma = sqlite3_mprintf("PRAGMA cipher_use_hmac = %d;", sqlcipher_codec_ctx_get_use_hmac(ctx)); codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); @@ -581,6 +585,44 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); } + }else + if( sqlite3StrICmp(zLeft,"cipher_default_settings")==0 ){ + int algorithm; + char *pragma; + + pragma = sqlite3_mprintf("PRAGMA cipher_default_kdf_iter = %d;", sqlcipher_get_default_kdf_iter()); + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + pragma = sqlite3_mprintf("PRAGMA cipher_default_page_size = %d;", sqlcipher_get_default_pagesize()); + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + pragma = sqlite3_mprintf("PRAGMA cipher_default_use_hmac = %d;", sqlcipher_get_default_use_hmac()); + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + pragma = sqlite3_mprintf("PRAGMA cipher_default_plaintext_header_size = %d;", sqlcipher_get_default_plaintext_header_size()); + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + algorithm = sqlcipher_get_default_hmac_algorithm(); + pragma = NULL; + if(algorithm == SQLCIPHER_HMAC_SHA1) { + pragma = sqlite3_mprintf("PRAGMA cipher_default_hmac_algorithm = %s;", SQLCIPHER_HMAC_SHA1_LABEL); + } else if(algorithm == SQLCIPHER_HMAC_SHA256) { + pragma = sqlite3_mprintf("PRAGMA cipher_default_hmac_algorithm = %s;", SQLCIPHER_HMAC_SHA256_LABEL); + } else if(algorithm == SQLCIPHER_HMAC_SHA512) { + pragma = sqlite3_mprintf("PRAGMA cipher_default_hmac_algorithm = %s;", SQLCIPHER_HMAC_SHA512_LABEL); + } + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); + + algorithm = sqlcipher_get_default_kdf_algorithm(); + pragma = NULL; + if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA1) { + pragma = sqlite3_mprintf("PRAGMA cipher_default_kdf_algorithm = %s;", SQLCIPHER_PBKDF2_HMAC_SHA1_LABEL); + } else if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA256) { + pragma = sqlite3_mprintf("PRAGMA cipher_default_kdf_algorithm = %s;", SQLCIPHER_PBKDF2_HMAC_SHA256_LABEL); + } else if(algorithm == SQLCIPHER_PBKDF2_HMAC_SHA512) { + pragma = sqlite3_mprintf("PRAGMA cipher_default_kdf_algorithm = %s;", SQLCIPHER_PBKDF2_HMAC_SHA512_LABEL); + } + codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); }else { return 0; } diff --git a/test/sqlcipher-pragmas.test b/test/sqlcipher-pragmas.test index 63b14a2..340f3ef 100644 --- a/test/sqlcipher-pragmas.test +++ b/test/sqlcipher-pragmas.test @@ -398,4 +398,26 @@ do_test verify-cipher_settings_v1 { db close file delete -force test.db +do_test verify-cipher_default_settings_v1 { + sqlite_orig db test.db + execsql { + PRAGMA cipher_default_compatibility = 1; + PRAGMA cipher_default_settings; + PRAGMA cipher_default_compatibility = 4; + } +} {{PRAGMA cipher_default_kdf_iter = 4000;} {PRAGMA cipher_default_page_size = 1024;} {PRAGMA cipher_default_use_hmac = 0;} {PRAGMA cipher_default_plaintext_header_size = 0;} {PRAGMA cipher_default_hmac_algorithm = HMAC_SHA1;} {PRAGMA cipher_default_kdf_algorithm = PBKDF2_HMAC_SHA1;}} +db close +file delete -force test.db + +do_test verify-cipher_default_settings_default { + sqlite_orig db test.db + execsql { + PRAGMA cipher_default_settings; + } +} {{PRAGMA cipher_default_kdf_iter = 256000;} {PRAGMA cipher_default_page_size = 4096;} {PRAGMA cipher_default_use_hmac = 1;} {PRAGMA cipher_default_plaintext_header_size = 0;} {PRAGMA cipher_default_hmac_algorithm = HMAC_SHA512;} {PRAGMA cipher_default_kdf_algorithm = PBKDF2_HMAC_SHA512;}} +db close +file delete -force test.db + + + finish_test From 4f9202c7632c55b739f9b1c60afcc7f6077aa4c5 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Wed, 16 Jan 2019 13:16:31 -0500 Subject: [PATCH 12/25] deprecates PRAGMA fast_kdf_iter --- CHANGELOG.md | 4 +++- src/crypto.c | 6 +++--- test/sqlcipher-compatibility.test | 2 +- test/sqlcipher-core.test | 4 ++-- test/sqlcipher-pragmas.test | 6 +++--- 5 files changed, 12 insertions(+), 10 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a16fcee..aad1b63 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,9 @@ All notable changes to this project will be documented in this file. - Normalize attach behavior when key is not yet derived - Adds PRAGMA cipher_settings to query current database codec settings - Adds PRAGMA cipher_default_settings to query current default SQLCipher options -- PRAGMA cipher_hmac_pgno and cipher_hmac_salt_mask are now deprecated +- PRAGMA cipher_hmac_pgno is now deprecated +- PRAGMA cipher_hmac_salt_mask is now deprecated +- PRAGMA fast_kdf_iter is now deprecated ## [4.0.1] - 2018-12-17 - Based on upstream SQLite 3.26.0 (addresses SQLite “Magellan” issue) diff --git a/src/crypto.c b/src/crypto.c index 1513f1b..341e5dd 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -199,7 +199,10 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef if( sqlite3StrICmp(zLeft, "fast_kdf_iter")==0){ if(ctx) { if( zRight ) { + char *deprecation = "PRAGMA fast_kdf_iter is deprecated, please remove from use"; sqlcipher_codec_ctx_set_fast_kdf_iter(ctx, atoi(zRight)); /* change of RW PBKDF2 iteration */ + codec_vdbe_return_string(pParse, "fast_kdf_iter", deprecation, P4_TRANSIENT); + sqlite3_log(SQLITE_WARNING, deprecation); } else { char *fast_kdf_iter = sqlite3_mprintf("%d", sqlcipher_codec_ctx_get_fast_kdf_iter(ctx)); codec_vdbe_return_string(pParse, "fast_kdf_iter", fast_kdf_iter, P4_DYNAMIC); @@ -550,9 +553,6 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef pragma = sqlite3_mprintf("PRAGMA kdf_iter = %d;", sqlcipher_codec_ctx_get_kdf_iter(ctx)); codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); - pragma = sqlite3_mprintf("PRAGMA fast_kdf_iter = %d;", sqlcipher_codec_ctx_get_fast_kdf_iter(ctx)); - codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); - pragma = sqlite3_mprintf("PRAGMA cipher_page_size = %d;", sqlcipher_codec_ctx_get_pagesize(ctx)); codec_vdbe_return_string(pParse, "pragma", pragma, P4_DYNAMIC); diff --git a/test/sqlcipher-compatibility.test b/test/sqlcipher-compatibility.test index 9d5c85e..80e3974 100644 --- a/test/sqlcipher-compatibility.test +++ b/test/sqlcipher-compatibility.test @@ -936,7 +936,7 @@ do_test open-2.0-beta-database { SELECT count(*) FROM t1; SELECT distinct * FROM t1; } -} {{PRAGMA cipher_hmac_salt_mask is deprecated, please remove from use} 38768 test-0-0 test-0-1 test-1-0 test-1-1} +} {{PRAGMA fast_kdf_iter is deprecated, please remove from use} {PRAGMA cipher_hmac_salt_mask is deprecated, please remove from use} 38768 test-0-0 test-0-1 test-1-0 test-1-1} db close # open a 2.0 beta database diff --git a/test/sqlcipher-core.test b/test/sqlcipher-core.test index 224bd59..fe7cb34 100644 --- a/test/sqlcipher-core.test +++ b/test/sqlcipher-core.test @@ -668,7 +668,7 @@ do_test custom-hmac-kdf-iter { execsql { PRAGMA key = 'testkey'; - PRAGMA fast_kdf_iter = 10; + PRAGMA kdf_iter = 10; CREATE table t1(a,b); BEGIN; } @@ -687,7 +687,7 @@ do_test custom-hmac-kdf-iter { execsql { PRAGMA key = 'testkey'; - PRAGMA fast_kdf_iter = 10; + PRAGMA kdf_iter = 10; SELECT count(*) FROM t1; } diff --git a/test/sqlcipher-pragmas.test b/test/sqlcipher-pragmas.test index 340f3ef..843ed2a 100644 --- a/test/sqlcipher-pragmas.test +++ b/test/sqlcipher-pragmas.test @@ -173,7 +173,7 @@ do_test verify-pragma-kdf-iter-reports-value-changed { PRAGMA fast_kdf_iter = 4000; PRAGMA fast_kdf_iter; } -} {4000} +} {{PRAGMA fast_kdf_iter is deprecated, please remove from use} 4000} db close file delete -force test.db @@ -383,7 +383,7 @@ do_test verify-cipher_settings_default { PRAGMA key = 'test'; PRAGMA cipher_settings; } -} {{PRAGMA kdf_iter = 256000;} {PRAGMA fast_kdf_iter = 2;} {PRAGMA cipher_page_size = 4096;} {PRAGMA cipher_use_hmac = 1;} {PRAGMA cipher_plaintext_header_size = 0;} {PRAGMA cipher_hmac_algorithm = HMAC_SHA512;} {PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA512;}} +} {{PRAGMA kdf_iter = 256000;} {PRAGMA cipher_page_size = 4096;} {PRAGMA cipher_use_hmac = 1;} {PRAGMA cipher_plaintext_header_size = 0;} {PRAGMA cipher_hmac_algorithm = HMAC_SHA512;} {PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA512;}} db close file delete -force test.db @@ -394,7 +394,7 @@ do_test verify-cipher_settings_v1 { PRAGMA cipher_compatibility = 1; PRAGMA cipher_settings; } -} {{PRAGMA kdf_iter = 4000;} {PRAGMA fast_kdf_iter = 2;} {PRAGMA cipher_page_size = 1024;} {PRAGMA cipher_use_hmac = 0;} {PRAGMA cipher_plaintext_header_size = 0;} {PRAGMA cipher_hmac_algorithm = HMAC_SHA1;} {PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA1;}} +} {{PRAGMA kdf_iter = 4000;} {PRAGMA cipher_page_size = 1024;} {PRAGMA cipher_use_hmac = 0;} {PRAGMA cipher_plaintext_header_size = 0;} {PRAGMA cipher_hmac_algorithm = HMAC_SHA1;} {PRAGMA cipher_kdf_algorithm = PBKDF2_HMAC_SHA1;}} db close file delete -force test.db From 1ca606d4a2fe894d5d524d7edea8872d41845b86 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Wed, 16 Jan 2019 13:58:59 -0500 Subject: [PATCH 13/25] rework salt initialization to ensure PRAGMA cipher_salt always returns a value --- src/crypto.c | 23 +++++++++++----- src/crypto.h | 2 +- src/crypto_impl.c | 40 ++++++++++++++++++++-------- test/sqlcipher-plaintext-header.test | 9 ++++--- 4 files changed, 52 insertions(+), 22 deletions(-) diff --git a/src/crypto.c b/src/crypto.c index 341e5dd..0c43367 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -337,9 +337,15 @@ int sqlcipher_codec_pragma(sqlite3* db, int iDb, Parse *pParse, const char *zLef sqlite3_free(salt); } } else { - char *salt = (char*) sqlite3_malloc((FILE_HEADER_SZ*2)+1); - cipher_bin2hex(sqlcipher_codec_ctx_get_kdf_salt(ctx), FILE_HEADER_SZ, salt); - codec_vdbe_return_string(pParse, "cipher_salt", salt, P4_DYNAMIC); + void *salt; + char *hexsalt = (char*) sqlite3_malloc((FILE_HEADER_SZ*2)+1); + if((rc = sqlcipher_codec_ctx_get_kdf_salt(ctx, &salt)) == SQLITE_OK) { + cipher_bin2hex(salt, FILE_HEADER_SZ, hexsalt); + codec_vdbe_return_string(pParse, "cipher_salt", hexsalt, P4_DYNAMIC); + } else { + sqlite3_free(hexsalt); + sqlcipher_codec_ctx_set_error(ctx, rc); + } } } }else @@ -651,7 +657,6 @@ static void* sqlite3Codec(void *iCtx, void *data, Pgno pgno, int mode) { int page_sz = sqlcipher_codec_ctx_get_pagesize(ctx); unsigned char *pData = (unsigned char *) data; void *buffer = sqlcipher_codec_ctx_get_data(ctx); - void *kdf_salt = sqlcipher_codec_ctx_get_kdf_salt(ctx); int plaintext_header_sz = sqlcipher_codec_ctx_get_plaintext_header_size(ctx); int cctx = CIPHER_READ_CTX; @@ -687,9 +692,15 @@ static void* sqlite3Codec(void *iCtx, void *data, Pgno pgno, int mode) { cctx = CIPHER_WRITE_CTX; case CODEC_JOURNAL_OP: /* encrypt journal page, operate on read context use to get the original page data from the database */ - if(pgno == 1) /* copy initial part of file header or salt to buffer */ + if(pgno == 1) { /* copy initial part of file header or salt to buffer */ + void *kdf_salt = NULL; + /* retrieve the kdf salt */ + if((rc = sqlcipher_codec_ctx_get_kdf_salt(ctx, &kdf_salt)) != SQLITE_OK) { + sqlcipher_codec_ctx_set_error(ctx, rc); + return NULL; + } memcpy(buffer, plaintext_header_sz ? pData : kdf_salt, offset); - + } rc = sqlcipher_page_cipher(ctx, cctx, pgno, CIPHER_ENCRYPT, page_sz - offset, pData + offset, (unsigned char*)buffer + offset); if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc); return buffer; /* return persistent buffer data, pData remains intact */ diff --git a/src/crypto.h b/src/crypto.h index 63f1121..440c718 100644 --- a/src/crypto.h +++ b/src/crypto.h @@ -233,7 +233,7 @@ int sqlcipher_codec_ctx_set_kdf_iter(codec_ctx *, int); int sqlcipher_codec_ctx_get_kdf_iter(codec_ctx *ctx); int sqlcipher_codec_ctx_set_kdf_salt(codec_ctx *ctx, unsigned char *salt, int sz); -void* sqlcipher_codec_ctx_get_kdf_salt(codec_ctx *ctx); +int sqlcipher_codec_ctx_get_kdf_salt(codec_ctx *ctx, void **salt); int sqlcipher_codec_ctx_set_fast_kdf_iter(codec_ctx *, int); int sqlcipher_codec_ctx_get_fast_kdf_iter(codec_ctx *); diff --git a/src/crypto_impl.c b/src/crypto_impl.c index e5f22b8..ed7b600 100644 --- a/src/crypto_impl.c +++ b/src/crypto_impl.c @@ -756,6 +756,23 @@ void* sqlcipher_codec_ctx_get_data(codec_ctx *ctx) { return ctx->buffer; } +static int sqlcipher_codec_ctx_init_kdf_salt(codec_ctx *ctx) { + sqlite3_file *fd = sqlite3PagerFile(ctx->pBt->pBt->pPager); + + if(!ctx->need_kdf_salt) { + return SQLITE_OK; /* don't reload salt when not needed */ + } + + /* read salt from header, if present, otherwise generate a new random salt */ + CODEC_TRACE("sqlcipher_codec_ctx_init_kdf_salt: obtaining salt\n"); + if(fd == NULL || fd->pMethods == 0 || sqlite3OsRead(fd, ctx->kdf_salt, ctx->kdf_salt_sz, 0) != SQLITE_OK) { + CODEC_TRACE("sqlcipher_codec_ctx_init_kdf_salt: unable to read salt from file header, generating random\n"); + if(ctx->provider->random(ctx->provider_ctx, ctx->kdf_salt, ctx->kdf_salt_sz) != SQLITE_OK) return SQLITE_ERROR; + } + ctx->need_kdf_salt = 0; + return SQLITE_OK; +} + int sqlcipher_codec_ctx_set_kdf_salt(codec_ctx *ctx, unsigned char *salt, int size) { if(size >= ctx->kdf_salt_sz) { memcpy(ctx->kdf_salt, salt, ctx->kdf_salt_sz); @@ -765,8 +782,13 @@ int sqlcipher_codec_ctx_set_kdf_salt(codec_ctx *ctx, unsigned char *salt, int si return SQLITE_ERROR; } -void* sqlcipher_codec_ctx_get_kdf_salt(codec_ctx *ctx) { - return ctx->kdf_salt; +int sqlcipher_codec_ctx_get_kdf_salt(codec_ctx *ctx, void** salt) { + int rc = SQLITE_OK; + if(ctx->need_kdf_salt) { + rc = sqlcipher_codec_ctx_init_kdf_salt(ctx); + } + *salt = ctx->kdf_salt; + return rc; } void sqlcipher_codec_get_keyspec(codec_ctx *ctx, void **zKey, int *nKey) { @@ -1090,17 +1112,13 @@ static int sqlcipher_cipher_ctx_key_derive(codec_ctx *ctx, cipher_ctx *c_ctx) { ctx->hmac_kdf_salt, c_ctx->fast_kdf_iter, ctx->key_sz); - if(c_ctx->pass && c_ctx->pass_sz) { /* if pass is not null */ + if(c_ctx->pass && c_ctx->pass_sz) { /* if key material is present on the context for derivation */ + + /* if necessary, initialize the salt from the header or random source */ if(ctx->need_kdf_salt) { - sqlite3_file *fd = sqlite3PagerFile(ctx->pBt->pBt->pPager); - /* read salt from header, if present, otherwise generate a new random salt */ - CODEC_TRACE("sqlcipher_cipher_ctx_key_derive: obtaining salt\n"); - if(fd == NULL || fd->pMethods == 0 || sqlite3OsRead(fd, ctx->kdf_salt, ctx->kdf_salt_sz, 0) != SQLITE_OK) { - CODEC_TRACE("sqlcipher_cipher_ctx_key_derive: unable to read salt from file header, generating random\n"); - if(ctx->provider->random(ctx->provider_ctx, ctx->kdf_salt, ctx->kdf_salt_sz) != SQLITE_OK) return SQLITE_ERROR; - } - ctx->need_kdf_salt = 0; + if((rc = sqlcipher_codec_ctx_init_kdf_salt(ctx)) != SQLITE_OK) return rc; } + if (c_ctx->pass_sz == ((ctx->key_sz * 2) + 3) && sqlite3StrNICmp((const char *)c_ctx->pass ,"x'", 2) == 0 && cipher_isHex(c_ctx->pass + 2, ctx->key_sz * 2)) { int n = c_ctx->pass_sz - 3; /* adjust for leading x' and tailing ' */ const unsigned char *z = c_ctx->pass + 2; /* adjust lead offset of x' */ diff --git a/test/sqlcipher-plaintext-header.test b/test/sqlcipher-plaintext-header.test index fd9876e..f9f12a8 100644 --- a/test/sqlcipher-plaintext-header.test +++ b/test/sqlcipher-plaintext-header.test @@ -430,8 +430,9 @@ do_test test-plaintext-header-migrate-journal-wal-string-key-random-salt { db close file delete -force test.db -# when cipher_salt is the first statement the values are zeros -# after the databse is first used and key derivation occurs it will change +# when cipher_salt is the first statement a new salt should be generated +# and it should match the salt after key derviation occurs. At no point +# should the salt be zero do_test plaintext-header-size-salt-first-op { set rc {} sqlite_orig db test.db @@ -447,10 +448,10 @@ do_test plaintext-header-size-salt-first-op { PRAGMA cipher_salt; }] - lappend rc $salt1 lappend rc [string equal $salt1 "00000000000000000000000000000000"] lappend rc [string equal $salt2 "00000000000000000000000000000000"] -} {00000000000000000000000000000000 1 0} + lappend rc [string equal $salt1 $salt2] +} {0 0 1} db close file delete -force test.db From e04d8c98cfc052f65c36e862518cc1dffb49c539 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Fri, 8 Feb 2019 15:00:18 -0500 Subject: [PATCH 14/25] clear buffer if cipher operation fails per #304 --- src/crypto.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/crypto.c b/src/crypto.c index 0c43367..e60b533 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -683,7 +683,10 @@ static void* sqlite3Codec(void *iCtx, void *data, Pgno pgno, int mode) { memcpy(buffer, plaintext_header_sz ? pData : (void *) SQLITE_FILE_HEADER, offset); rc = sqlcipher_page_cipher(ctx, cctx, pgno, CIPHER_DECRYPT, page_sz - offset, pData + offset, (unsigned char*)buffer + offset); - if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc); + if(rc != SQLITE_OK) { /* clear results of failed cipher operation and set error */ + sqlcipher_memset(buffer+offset, 0, page_sz-offset); + sqlcipher_codec_ctx_set_error(ctx, rc); + } memcpy(pData, buffer, page_sz); /* copy buffer data back to pData and return */ return pData; break; @@ -702,7 +705,10 @@ static void* sqlite3Codec(void *iCtx, void *data, Pgno pgno, int mode) { memcpy(buffer, plaintext_header_sz ? pData : kdf_salt, offset); } rc = sqlcipher_page_cipher(ctx, cctx, pgno, CIPHER_ENCRYPT, page_sz - offset, pData + offset, (unsigned char*)buffer + offset); - if(rc != SQLITE_OK) sqlcipher_codec_ctx_set_error(ctx, rc); + if(rc != SQLITE_OK) { /* clear results of failed cipher operation and set error */ + sqlcipher_memset(buffer+offset, 0, page_sz-offset); + sqlcipher_codec_ctx_set_error(ctx, rc); + } return buffer; /* return persistent buffer data, pData remains intact */ break; From 19961d4cad76b1711baed837885ce143041a9645 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Fri, 8 Feb 2019 16:24:22 -0500 Subject: [PATCH 15/25] explicitly disable backup for encrypted databases --- src/backup.c | 20 +++++++++++++ test/sqlcipher-core.test | 63 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+) diff --git a/src/backup.c b/src/backup.c index 4200940..4b55cf5 100644 --- a/src/backup.c +++ b/src/backup.c @@ -153,6 +153,26 @@ sqlite3_backup *sqlite3_backup_init( } #endif +/* BEGIN SQLCIPHER */ +#ifdef SQLITE_HAS_CODEC + { + extern int sqlcipher_find_db_index(sqlite3*, const char*); + extern void sqlite3CodecGetKey(sqlite3*, int, void**, int*); + int srcNKey, destNKey; + void *zKey; + + sqlite3CodecGetKey(pSrcDb, sqlcipher_find_db_index(pSrcDb, zSrcDb), &zKey, &srcNKey); + sqlite3CodecGetKey(pDestDb, sqlcipher_find_db_index(pDestDb, zDestDb), &zKey, &destNKey); + zKey = NULL; + + if(srcNKey || destNKey) { + sqlite3ErrorWithMsg(pDestDb, SQLITE_ERROR, "backup is not supported with encrypted databases"); + return NULL; + } + } +#endif +/* END SQLCIPHER */ + /* Lock the source database handle. The destination database ** handle is not locked in this routine, but it is locked in ** sqlite3_backup_step(). The user is required to ensure that no diff --git a/test/sqlcipher-core.test b/test/sqlcipher-core.test index fe7cb34..876423d 100644 --- a/test/sqlcipher-core.test +++ b/test/sqlcipher-core.test @@ -862,4 +862,67 @@ db close dba close file delete -force test.db +do_test backup-encrypted-to-plain { + sqlite_orig db test.db + sqlite_orig db2 backup.db + execsql { + PRAGMA key = 'test'; + CREATE TABLE t1(a,b); + INSERT INTO t1(a,b) VALUES (1,2); + } + list [catch { sqlite3_backup B db2 main db main } msg] $msg +} {1 {sqlite3_backup_init() failed}} +db close +db2 close +file delete -force test.db +file delete -force backup.db + +do_test backup-plain-to-encrypted { + sqlite_orig db test.db + sqlite_orig db2 backup.db + execsql { + CREATE TABLE t1(a,b); + INSERT INTO t1(a,b) VALUES (1,2); + } + execsql { + PRAGMA key = 'test'; + } db2 + + list [catch { sqlite3_backup B db2 main db main } msg] $msg +} {1 {sqlite3_backup_init() failed}} +db close +db2 close +file delete -force test.db +file delete -force backup.db + +do_test backup-encrypted-to-encrypted { + sqlite_orig db test.db + sqlite_orig db2 backup.db + execsql { + PRAGMA key = 'test'; + CREATE TABLE t1(a,b); + INSERT INTO t1(a,b) VALUES (1,2); + } + execsql { + PRAGMA key = 'test'; + } db2 + list [catch { sqlite3_backup B db2 main db main } msg] $msg +} {1 {sqlite3_backup_init() failed}} +db close +db2 close +file delete -force test.db +file delete -force backup.db + +do_test backup-plain-to-plain { + sqlite_orig db test.db + sqlite_orig db2 backup.db + execsql { + CREATE TABLE t1(a,b); + INSERT INTO t1(a,b) VALUES (1,2); + } + sqlite3_backup B db2 main db main + B step -1 + B finish +} {SQLITE_OK} + finish_test From 724b61d3a113eae38a1e0e7f15d600d7a1dca5f9 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Sun, 10 Feb 2019 10:33:27 -0500 Subject: [PATCH 16/25] unset BTS_PAGESIZE_FIXED prior to adjusting migration database page size --- src/crypto_impl.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/crypto_impl.c b/src/crypto_impl.c index ed7b600..8b7f3dd 100644 --- a/src/crypto_impl.c +++ b/src/crypto_impl.c @@ -1339,6 +1339,8 @@ migrate: pSrc = pDb->pBt; nRes = sqlite3BtreeGetOptimalReserve(pSrc); + /* unset the BTS_PAGESIZE_FIXED flag to avoid SQLITE_READONLY */ + pDest->pBt->btsFlags &= ~BTS_PAGESIZE_FIXED; rc = sqlite3BtreeSetPageSize(pDest, default_page_size, nRes, 0); CODEC_TRACE("set btree page size to %d res %d rc %d\n", default_page_size, nRes, rc); if( rc!=SQLITE_OK ) goto handle_error; From 4745d8a4851d777fcbd836d805de9ae96860361b Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Sun, 10 Feb 2019 10:35:42 -0500 Subject: [PATCH 17/25] Snapshot of upstream SQLite 3.27.1 --- Makefile.in | 43 +- Makefile.msc | 25 +- VERSION | 2 +- autoconf/Makefile.msc | 2 + configure | 18 +- ext/expert/expert1.test | 6 +- ext/fts3/fts3.c | 128 +- ext/fts3/fts3Int.h | 14 + ext/fts3/fts3_aux.c | 10 +- ext/fts3/fts3_expr.c | 15 +- ext/fts3/fts3_hash.c | 4 +- ext/fts3/fts3_icu.c | 4 +- ext/fts3/fts3_snippet.c | 64 +- ext/fts3/fts3_term.c | 6 +- ext/fts3/fts3_test.c | 31 +- ext/fts3/fts3_tokenize_vtab.c | 2 +- ext/fts3/fts3_unicode.c | 17 +- ext/fts3/fts3_unicode2.c | 71 +- ext/fts3/fts3_write.c | 47 +- ext/fts3/unicode/mkunicode.tcl | 53 +- ext/fts3/unicode/parseunicode.tcl | 31 +- ext/fts5/fts5.h | 20 +- ext/fts5/fts5Int.h | 28 +- ext/fts5/fts5_aux.c | 20 +- ext/fts5/fts5_buffer.c | 12 +- ext/fts5/fts5_config.c | 8 +- ext/fts5/fts5_expr.c | 55 +- ext/fts5/fts5_hash.c | 22 +- ext/fts5/fts5_index.c | 253 +- ext/fts5/fts5_main.c | 306 +- ext/fts5/fts5_storage.c | 25 +- ext/fts5/fts5_test_mi.c | 4 +- ext/fts5/fts5_test_tok.c | 6 +- ext/fts5/fts5_tokenize.c | 37 +- ext/fts5/fts5_unicode2.c | 82 +- ext/fts5/fts5_varint.c | 3 +- ext/fts5/fts5_vocab.c | 69 +- ext/fts5/test/fts5aa.test | 3 +- ext/fts5/test/fts5ai.test | 6 + ext/fts5/test/fts5ak.test | 8 + ext/fts5/test/fts5circref.test | 80 + ext/fts5/test/fts5corrupt3.test | 7374 ++++++++++++++++++++++++++++- ext/fts5/test/fts5interrupt.test | 67 + ext/fts5/test/fts5tokenizer.test | 2 +- ext/fts5/test/fts5umlaut.test | 65 + ext/fts5/test/fts5unicode3.test | 24 +- ext/fts5/test/fts5update.test | 38 + ext/fts5/test/fts5vocab.test | 66 +- ext/fts5/test/fts5vocab2.test | 39 +- ext/misc/amatch.c | 10 +- ext/misc/closure.c | 6 +- ext/misc/csv.c | 2 +- ext/misc/dbdump.c | 2 +- ext/misc/eval.c | 2 +- ext/misc/fileio.c | 45 +- ext/misc/fuzzer.c | 16 +- ext/misc/json1.c | 6 +- ext/misc/memstat.c | 2 +- ext/misc/memtrace.c | 108 + ext/misc/mmapwarm.c | 1 - ext/misc/nextchar.c | 4 +- ext/misc/percentile.c | 2 +- ext/misc/prefixes.c | 319 ++ ext/misc/regexp.c | 6 +- ext/misc/unionvtab.c | 8 +- ext/misc/vfslog.c | 2 +- ext/misc/zipfile.c | 24 +- ext/rbu/rbu_common.tcl | 13 +- ext/rbu/rbuvacuum2.test | 27 +- ext/rbu/rbuvacuum3.test | 63 + ext/rbu/sqlite3rbu.c | 13 +- ext/rbu/sqlite3rbu.h | 6 +- ext/rbu/test_rbu.c | 1 + ext/rtree/geopoly.c | 95 +- ext/rtree/rtree.c | 135 +- ext/rtree/rtree1.test | 14 + ext/rtree/rtree6.test | 13 + ext/rtree/rtreecirc.test | 66 + ext/rtree/rtreefuzz001.test | 777 +++ ext/session/changeset.c | 6 +- ext/session/changesetfuzz.c | 15 +- ext/session/session_speed_test.c | 2 - ext/session/sessionwor.test | 76 +- ext/session/sqlite3session.c | 36 +- ext/session/sqlite3session.h | 2 +- main.mk | 31 +- manifest | 423 +- manifest.uuid | 2 +- src/alter.c | 56 +- src/analyze.c | 2 +- src/attach.c | 15 +- src/btree.c | 401 +- src/btree.h | 1 + src/btreeInt.h | 13 +- src/build.c | 132 +- src/callback.c | 21 +- src/dbstat.c | 10 +- src/delete.c | 8 +- src/expr.c | 680 +-- src/fkey.c | 22 +- src/func.c | 10 +- src/global.c | 12 +- src/hash.c | 56 - src/insert.c | 67 +- src/legacy.c | 5 +- src/loadext.c | 2 +- src/main.c | 68 +- src/memdb.c | 46 +- src/pager.c | 5 +- src/parse.y | 43 +- src/pcache1.c | 31 +- src/pragma.c | 25 +- src/pragma.h | 13 +- src/prepare.c | 320 +- src/printf.c | 209 +- src/resolve.c | 125 +- src/select.c | 107 +- src/shell.c.in | 458 +- src/sqlite.h.in | 51 +- src/sqliteInt.h | 69 +- src/tclsqlite.c | 55 +- src/test1.c | 80 + src/test_journal.c | 2 +- src/test_vfs.c | 125 +- src/tokenize.c | 211 +- src/treeview.c | 3 +- src/trigger.c | 5 +- src/update.c | 11 +- src/util.c | 7 +- src/vacuum.c | 72 +- src/vdbe.c | 126 +- src/vdbe.h | 21 +- src/vdbeInt.h | 30 +- src/vdbeapi.c | 40 +- src/vdbeaux.c | 220 +- src/vdbemem.c | 13 +- src/vtab.c | 2 + src/walker.c | 31 +- src/where.c | 65 +- src/whereInt.h | 3 + src/wherecode.c | 48 +- src/whereexpr.c | 6 +- src/window.c | 20 +- test/altercol.test | 26 + test/altertab.test | 53 + test/altertab2.test | 263 +- test/altertab3.test | 86 + test/autoindex1.test | 8 +- test/bestindex3.test | 18 +- test/btree02.test | 18 +- test/conflict.test | 12 +- test/corruptL.test | 725 +++ test/cost.test | 21 +- test/csv01.test | 23 + test/dbfuzz001.test | 374 ++ test/dbfuzz2.c | 237 +- test/e_select.test | 15 +- test/eqp.test | 28 +- test/fallocate.test | 9 + test/fkey8.test | 34 + test/fts3_common.tcl | 4 + test/fts3aa.test | 11 + test/fts3aux2.test | 24 + test/fts3corrupt4.test | 2908 ++++++++++++ test/fts3expr5.test | 19 + test/fts3fault.test | 16 + test/fts3fuzz001.test | 114 + test/fts3snippet.test | 5 + test/fts4umlaut.test | 64 + test/fuzz4.test | 82 + test/fuzzcheck.c | 550 ++- test/fuzzdata7.db | Bin 16369664 -> 16417792 bytes test/fuzzdata8.db | Bin 0 -> 960512 bytes test/index6.test | 21 +- test/indexexpr2.test | 47 + test/insert.test | 9 + test/insertfault.test | 36 + test/join.test | 46 +- test/join5.test | 18 +- test/json101.test | 19 +- test/lock_common.tcl | 10 +- test/memdb1.test | 27 +- test/misc1.test | 14 + test/misc7.test | 3 + test/normalize.test | 18 +- test/ossfuzz.c | 5 + test/permutations.test | 20 +- test/prefixes.test | 88 + test/releasetest.tcl | 1 + test/resetdb.test | 8 +- test/rowvalue4.test | 4 +- test/select1.test | 21 +- test/shell1.test | 2 +- test/shell4.test | 10 +- test/shmlock.test | 180 + test/snapshot_fault.test | 25 + test/tabfunc01.test | 5 + test/tester.tcl | 10 +- test/triggerC.test | 16 + test/triggerF.test | 2 +- test/unionvtab.test | 4 +- test/update2.test | 16 + test/vacuum-into.test | 90 + test/vtabdrop.test | 127 + test/wal.test | 90 +- test/walfault2.test | 91 + test/walvfs.test | 429 ++ test/where7.test | 6 +- test/where9.test | 18 +- test/whereI.test | 12 +- test/window1.test | 109 +- test/with1.test | 47 + test/with3.test | 2 +- test/zeroblob.test | 11 + tool/dbtotxt.c | 146 + tool/dbtotxt.md | 56 + tool/index_usage.c | 233 + tool/lemon.c | 12 +- tool/lempar.c | 26 +- tool/mkpragmatab.tcl | 5 +- 220 files changed, 21148 insertions(+), 2769 deletions(-) create mode 100644 ext/fts5/test/fts5circref.test create mode 100644 ext/fts5/test/fts5interrupt.test create mode 100644 ext/fts5/test/fts5umlaut.test create mode 100644 ext/misc/memtrace.c create mode 100644 ext/misc/prefixes.c create mode 100644 ext/rbu/rbuvacuum3.test create mode 100644 ext/rtree/rtreecirc.test create mode 100644 ext/rtree/rtreefuzz001.test create mode 100644 test/altertab3.test create mode 100644 test/corruptL.test create mode 100644 test/dbfuzz001.test create mode 100644 test/fts3fuzz001.test create mode 100644 test/fts4umlaut.test create mode 100644 test/fuzz4.test create mode 100644 test/fuzzdata8.db create mode 100644 test/insertfault.test create mode 100644 test/prefixes.test create mode 100644 test/shmlock.test create mode 100644 test/vacuum-into.test create mode 100644 test/vtabdrop.test create mode 100644 test/walfault2.test create mode 100644 test/walvfs.test create mode 100644 tool/dbtotxt.c create mode 100644 tool/dbtotxt.md create mode 100644 tool/index_usage.c diff --git a/Makefile.in b/Makefile.in index d2f9710..65530e3 100644 --- a/Makefile.in +++ b/Makefile.in @@ -452,6 +452,7 @@ TESTSRC += \ $(TOP)/ext/misc/nextchar.c \ $(TOP)/ext/misc/normalize.c \ $(TOP)/ext/misc/percentile.c \ + $(TOP)/ext/misc/prefixes.c \ $(TOP)/ext/misc/regexp.c \ $(TOP)/ext/misc/remember.c \ $(TOP)/ext/misc/series.c \ @@ -588,7 +589,8 @@ FUZZDATA = \ $(TOP)/test/fuzzdata4.db \ $(TOP)/test/fuzzdata5.db \ $(TOP)/test/fuzzdata6.db \ - $(TOP)/test/fuzzdata7.db + $(TOP)/test/fuzzdata7.db \ + $(TOP)/test/fuzzdata8.db # Standard options to testfixture # @@ -611,6 +613,12 @@ FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ FUZZCHECK_OPT += -DSQLITE_MAX_MEMORY=50000000 FUZZCHECK_OPT += -DSQLITE_PRINTF_PRECISION_LIMIT=1000 +FUZZCHECK_OPT += -DSQLITE_ENABLE_DESERIALIZE +FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS4 +#FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS5 +FUZZCHECK_OPT += -DSQLITE_ENABLE_RTREE +FUZZCHECK_OPT += -DSQLITE_ENABLE_GEOPOLY +FUZZCHECK_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB FUZZCHECK_SRC = $(TOP)/test/fuzzcheck.c $(TOP)/test/ossfuzz.c DBFUZZ_OPT = @@ -669,7 +677,7 @@ ossshell$(TEXE): $(TOP)/test/ossfuzz.c $(TOP)/test/ossshell.c sqlite3.c sqlite3. $(TOP)/test/ossfuzz.c sqlite3.c $(TLIBS) sessionfuzz$(TEXE): $(TOP)/test/sessionfuzz.c sqlite3.c sqlite3.h - $(CC) $(CFLAGS) -I. -o $@ $(TOP)/test/sessionfuzz.c $(TLIBS) + $(LTLINK) -o $@ $(TOP)/test/sessionfuzz.c $(TLIBS) dbfuzz$(TEXE): $(TOP)/test/dbfuzz.c sqlite3.c sqlite3.h $(LTLINK) -o $@ $(DBFUZZ_OPT) $(TOP)/test/dbfuzz.c sqlite3.c $(TLIBS) @@ -682,11 +690,26 @@ DBFUZZ2_OPTS = \ -DSQLITE_ENABLE_DBSTAT_VTAB \ -DSQLITE_ENABLE_RTREE \ -DSQLITE_ENABLE_FTS4 \ - -DSQLITE_EANBLE_FTS5 + -DSQLITE_ENABLE_FTS5 -dbfuzz2: $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h - clang-6.0 -I. -g -O0 -fsanitize=fuzzer,undefined,address -o dbfuzz2 \ - $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c +dbfuzz2$(TEXE): $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h + $(CC) $(OPT_FEATURE_FLAGS) $(OPTS) -I. -g -O0 \ + -DSTANDALONE -o dbfuzz2 \ + $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c $(TLIBS) + mkdir -p dbfuzz2-dir + cp $(TOP)/test/dbfuzz2-seed* dbfuzz2-dir + +dbfuzz2-asan: $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h + clang-6.0 $(OPT_FEATURE_FLAGS) $(OPTS) -I. -g -O0 \ + -fsanitize=fuzzer,undefined,address -o dbfuzz2-asan \ + $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c $(TLIBS) + mkdir -p dbfuzz2-dir + cp $(TOP)/test/dbfuzz2-seed* dbfuzz2-dir + +dbfuzz2-msan: $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h + clang-6.0 $(OPT_FEATURE_FLAGS) $(OPTS) -I. -g -O0 \ + -fsanitize=fuzzer,undefined,memory -o dbfuzz2-msan \ + $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c $(TLIBS) mkdir -p dbfuzz2-dir cp $(TOP)/test/dbfuzz2-seed* dbfuzz2-dir @@ -1052,6 +1075,7 @@ SHELL_SRC = \ $(TOP)/ext/expert/sqlite3expert.c \ $(TOP)/ext/expert/sqlite3expert.h \ $(TOP)/ext/misc/zipfile.c \ + $(TOP)/ext/misc/memtrace.c \ $(TOP)/src/test_windirent.c shell.c: $(SHELL_SRC) $(TOP)/tool/mkshellc.tcl @@ -1189,6 +1213,7 @@ TESTFIXTURE_FLAGS += -DSQLITE_SERIES_CONSTRAINT_VERIFY=1 TESTFIXTURE_FLAGS += -DSQLITE_DEFAULT_PAGE_SIZE=1024 TESTFIXTURE_FLAGS += -DSQLITE_ENABLE_STMTVTAB TESTFIXTURE_FLAGS += -DSQLITE_ENABLE_DBPAGE_VTAB +TESTFIXTURE_FLAGS += -DSQLITE_ENABLE_DESERIALIZE TESTFIXTURE_SRC0 = $(TESTSRC2) libsqlite3.la TESTFIXTURE_SRC1 = sqlite3.c @@ -1291,6 +1316,9 @@ dbdump$(TEXE): $(TOP)/ext/misc/dbdump.c sqlite3.lo $(LTLINK) -DDBDUMP_STANDALONE -o $@ \ $(TOP)/ext/misc/dbdump.c sqlite3.lo $(TLIBS) +dbtotxt$(TEXE): $(TOP)/tool/dbtotxt.c + $(LTLINK)-o $@ $(TOP)/tool/dbtotxt.c + showdb$(TEXE): $(TOP)/tool/showdb.c sqlite3.lo $(LTLINK) -o $@ $(TOP)/tool/showdb.c sqlite3.lo $(TLIBS) @@ -1306,6 +1334,9 @@ showwal$(TEXE): $(TOP)/tool/showwal.c sqlite3.lo showshm$(TEXE): $(TOP)/tool/showshm.c $(LTLINK) -o $@ $(TOP)/tool/showshm.c +index_usage$(TEXE): $(TOP)/tool/index_usage.c sqlite3.lo + $(LTLINK) $(SHELL_OPT) -o $@ $(TOP)/tool/index_usage.c sqlite3.lo $(TLIBS) + changeset$(TEXE): $(TOP)/ext/session/changeset.c sqlite3.lo $(LTLINK) -o $@ $(TOP)/ext/session/changeset.c sqlite3.lo $(TLIBS) diff --git a/Makefile.msc b/Makefile.msc index e3feffa..b4fa372 100644 --- a/Makefile.msc +++ b/Makefile.msc @@ -1527,6 +1527,7 @@ TESTEXT = \ $(TOP)\ext\misc\nextchar.c \ $(TOP)\ext\misc\normalize.c \ $(TOP)\ext\misc\percentile.c \ + $(TOP)\ext\misc\prefixes.c \ $(TOP)\ext\misc\regexp.c \ $(TOP)\ext\misc\remember.c \ $(TOP)\ext\misc\series.c \ @@ -1625,7 +1626,8 @@ FUZZDATA = \ $(TOP)\test\fuzzdata4.db \ $(TOP)\test\fuzzdata5.db \ $(TOP)\test\fuzzdata6.db \ - $(TOP)\test\fuzzdata7.db + $(TOP)\test\fuzzdata7.db \ + $(TOP)\test\fuzzdata8.db # <> # Additional compiler options for the shell. These are only effective @@ -1643,7 +1645,13 @@ SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_DESERIALIZE=1 # MPTESTER_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_FTS5 FUZZERSHELL_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -FUZZCHECK_COMPILE_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ -DSQLITE_MAX_MEMORY=50000000 -DSQLITE_PRINTF_PRECISION_LIMIT=1000 +FUZZCHECK_OPTS = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 -DSQLITE_OSS_FUZZ -DSQLITE_MAX_MEMORY=50000000 -DSQLITE_PRINTF_PRECISION_LIMIT=1000 +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_DESERIALIZE +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_FTS4 +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_RTREE +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_GEOPOLY +FUZZCHECK_OPTS = $(FUZZCHECK_OPTS) -DSQLITE_ENABLE_DBSTAT_VTAB + FUZZCHECK_SRC = $(TOP)\test\fuzzcheck.c $(TOP)\test\ossfuzz.c OSSSHELL_SRC = $(TOP)\test\ossshell.c $(TOP)\test\ossfuzz.c DBFUZZ_COMPILE_OPTS = -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION @@ -1730,10 +1738,10 @@ dbfuzz.exe: $(TOP)\test\dbfuzz.c $(SQLITE3C) $(SQLITE3H) $(LTLINK) $(NO_WARN) $(DBFUZZ_COMPILE_OPTS) $(TOP)\test\dbfuzz.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) fuzzcheck.exe: $(FUZZCHECK_SRC) $(SQLITE3C) $(SQLITE3H) - $(LTLINK) $(NO_WARN) $(FUZZCHECK_COMPILE_OPTS) $(FUZZCHECK_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) + $(LTLINK) $(NO_WARN) $(FUZZCHECK_OPTS) $(FUZZCHECK_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) ossshell.exe: $(OSSSHELL_SRC) $(SQLITE3C) $(SQLITE3H) - $(LTLINK) $(NO_WARN) $(FUZZCHECK_COMPILE_OPTS) $(OSSSHELL_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) + $(LTLINK) $(NO_WARN) $(FUZZCHECK_OPTS) $(OSSSHELL_SRC) $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) sessionfuzz.exe: zlib $(TOP)\test\sessionfuzz.c $(SQLITE3C) $(SQLITE3H) $(LTLINK) $(NO_WARN) -I$(ZLIBINCDIR) $(TOP)\test\sessionfuzz.c /link $(LDFLAGS) $(LTLINKOPTS) /LIBPATH:$(ZLIBLIBDIR) $(ZLIBLIB) @@ -2130,6 +2138,7 @@ SHELL_SRC = \ $(TOP)\ext\misc\completion.c \ $(TOP)\ext\expert\sqlite3expert.c \ $(TOP)\ext\expert\sqlite3expert.h \ + $(TOP)\ext\misc\memtrace.c \ $(TOP)\src\test_windirent.c # If use of zlib is enabled, add the "zipfile.c" source file. @@ -2298,6 +2307,7 @@ TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_DEFAULT_PAGE_SIZE=1024 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_ENABLE_STMTVTAB=1 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_ENABLE_DBPAGE_VTAB=1 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_ENABLE_JSON1=1 +TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) -DSQLITE_ENABLE_DESERIALIZE=1 TESTFIXTURE_FLAGS = $(TESTFIXTURE_FLAGS) $(TEST_CCONV_OPTS) TESTFIXTURE_SRC0 = $(TESTEXT) $(TESTSRC2) @@ -2425,6 +2435,9 @@ testloadext.lo: $(TOP)\src\test_loadext.c $(SQLITE3H) testloadext.dll: testloadext.lo $(LD) $(LDFLAGS) $(LTLINKOPTS) $(LTLIBPATHS) /DLL /OUT:$@ testloadext.lo +dbtotxt.exe: $(TOP)\tool\dbtotxt.c + $(LTLINK) $(NO_WARN) $(TOP)\tool\dbtotxt.c /link $(LDFLAGS) $(LTLINKOPTS) + showdb.exe: $(TOP)\tool\showdb.c $(SQLITE3C) $(SQLITE3H) $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ $(TOP)\tool\showdb.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) @@ -2444,6 +2457,10 @@ showwal.exe: $(TOP)\tool\showwal.c $(SQLITE3C) $(SQLITE3H) showshm.exe: $(TOP)\tool\showshm.c $(LTLINK) $(NO_WARN) $(TOP)\tool\showshm.c /link $(LDFLAGS) $(LTLINKOPTS) +index_usage.exe: $(TOP)\tool\index_usage.c $(SQLITE3C) $(SQLITE3H) + $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ + $(TOP)\tool\index_usage.c $(SQLITE3C) /link $(LDFLAGS) $(LTLINKOPTS) + changeset.exe: $(TOP)\ext\session\changeset.c $(SQLITE3C) $(SQLITE3H) $(LTLINK) $(NO_WARN) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ -DSQLITE_ENABLE_SESSION=1 -DSQLITE_ENABLE_PREUPDATE_HOOK=1 \ diff --git a/VERSION b/VERSION index 419ede3..c521c77 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.26.0 +3.27.1 diff --git a/autoconf/Makefile.msc b/autoconf/Makefile.msc index 270c83c..a131d4c 100644 --- a/autoconf/Makefile.msc +++ b/autoconf/Makefile.msc @@ -283,6 +283,7 @@ OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_STMTVTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBPAGE_VTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DBSTAT_VTAB=1 OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_INTROSPECTION_PRAGMAS=1 +OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_DESERIALIZE=1 !ENDIF OPT_FEATURE_FLAGS = $(OPT_FEATURE_FLAGS) -DSQLITE_ENABLE_COLUMN_METADATA=1 !ENDIF @@ -937,6 +938,7 @@ LIBRESOBJS = SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_FTS4=1 SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_EXPLAIN_COMMENTS=1 SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_OFFSET_SQL_FUNC=1 +SHELL_COMPILE_OPTS = $(SHELL_COMPILE_OPTS) -DSQLITE_ENABLE_DESERIALIZE=1 !ENDIF diff --git a/configure b/configure index 51653aa..bb8daa5 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sqlite 3.26.0. +# Generated by GNU Autoconf 2.69 for sqlite 3.27.1. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -726,8 +726,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sqlite' PACKAGE_TARNAME='sqlite' -PACKAGE_VERSION='3.26.0' -PACKAGE_STRING='sqlite 3.26.0' +PACKAGE_VERSION='3.27.1' +PACKAGE_STRING='sqlite 3.27.1' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1466,7 +1466,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sqlite 3.26.0 to adapt to many kinds of systems. +\`configure' configures sqlite 3.27.1 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1531,7 +1531,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sqlite 3.26.0:";; + short | recursive ) echo "Configuration of sqlite 3.27.1:";; esac cat <<\_ACEOF @@ -1657,7 +1657,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.26.0 +sqlite configure 3.27.1 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2076,7 +2076,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sqlite $as_me 3.26.0, which was +It was created by sqlite $as_me 3.27.1, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -12232,7 +12232,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sqlite $as_me 3.26.0, which was +This file was extended by sqlite $as_me 3.27.1, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12298,7 +12298,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sqlite config.status 3.26.0 +sqlite config.status 3.27.1 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/ext/expert/expert1.test b/ext/expert/expert1.test index 2b46683..912c074 100644 --- a/ext/expert/expert1.test +++ b/ext/expert/expert1.test @@ -243,8 +243,10 @@ do_setup_rec_test $tn.12.1 { CREATE INDEX t7_idx_00000062 ON t7(b); CREATE INDEX t7_idx_00000061 ON t7(a); MULTI-INDEX OR - SEARCH TABLE t7 USING INDEX t7_idx_00000061 (a=?) - SEARCH TABLE t7 USING INDEX t7_idx_00000062 (b=?) + INDEX 1 + SEARCH TABLE t7 USING INDEX t7_idx_00000061 (a=?) + INDEX 2 + SEARCH TABLE t7 USING INDEX t7_idx_00000062 (b=?) } # rowid terms. diff --git a/ext/fts3/fts3.c b/ext/fts3/fts3.c index f6fb931..bd0003d 100644 --- a/ext/fts3/fts3.c +++ b/ext/fts3/fts3.c @@ -320,6 +320,14 @@ int sqlite3Fts3Never(int b) { assert( !b ); return b; } # endif #endif +/* +** This variable is set to false when running tests for which the on disk +** structures should not be corrupt. Otherwise, true. If it is false, extra +** assert() conditions in the fts3 code are activated - conditions that are +** only true if it is guaranteed that the fts3 database is not corrupt. +*/ +int sqlite3_fts3_may_be_corrupt = 1; + /* ** Write a 64-bit variable-length integer to memory starting at p[0]. ** The length of data written will be between 1 and FTS3_VARINT_MAX bytes. @@ -338,7 +346,7 @@ int sqlite3Fts3PutVarint(char *p, sqlite_int64 v){ } #define GETVARINT_STEP(v, ptr, shift, mask1, mask2, var, ret) \ - v = (v & mask1) | ( (*ptr++) << shift ); \ + v = (v & mask1) | ( (*(const unsigned char*)(ptr++)) << shift ); \ if( (v & mask2)==0 ){ var = v; return ret; } #define GETVARINT_INIT(v, ptr, shift, mask1, mask2, var, ret) \ v = (*ptr++); \ @@ -376,20 +384,21 @@ int sqlite3Fts3GetVarint(const char *pBuf, sqlite_int64 *v){ ** a non-negative 32-bit integer before it is returned. */ int sqlite3Fts3GetVarint32(const char *p, int *pi){ + const unsigned char *ptr = (const unsigned char*)p; u32 a; #ifndef fts3GetVarint32 - GETVARINT_INIT(a, p, 0, 0x00, 0x80, *pi, 1); + GETVARINT_INIT(a, ptr, 0, 0x00, 0x80, *pi, 1); #else - a = (*p++); + a = (*ptr++); assert( a & 0x80 ); #endif - GETVARINT_STEP(a, p, 7, 0x7F, 0x4000, *pi, 2); - GETVARINT_STEP(a, p, 14, 0x3FFF, 0x200000, *pi, 3); - GETVARINT_STEP(a, p, 21, 0x1FFFFF, 0x10000000, *pi, 4); + GETVARINT_STEP(a, ptr, 7, 0x7F, 0x4000, *pi, 2); + GETVARINT_STEP(a, ptr, 14, 0x3FFF, 0x200000, *pi, 3); + GETVARINT_STEP(a, ptr, 21, 0x1FFFFF, 0x10000000, *pi, 4); a = (a & 0x0FFFFFFF ); - *pi = (int)(a | ((u32)(*p & 0x07) << 28)); + *pi = (int)(a | ((u32)(*ptr & 0x07) << 28)); assert( 0==(a & 0x80000000) ); assert( *pi>=0 ); return 5; @@ -560,13 +569,18 @@ static int fts3DestroyMethod(sqlite3_vtab *pVtab){ sqlite3 *db = p->db; /* Database handle */ /* Drop the shadow tables */ - if( p->zContentTbl==0 ){ - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_content'", zDb, p->zName); - } - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segments'", zDb,p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_segdir'", zDb, p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_docsize'", zDb, p->zName); - fts3DbExec(&rc, db, "DROP TABLE IF EXISTS %Q.'%q_stat'", zDb, p->zName); + fts3DbExec(&rc, db, + "DROP TABLE IF EXISTS %Q.'%q_segments';" + "DROP TABLE IF EXISTS %Q.'%q_segdir';" + "DROP TABLE IF EXISTS %Q.'%q_docsize';" + "DROP TABLE IF EXISTS %Q.'%q_stat';" + "%s DROP TABLE IF EXISTS %Q.'%q_content';", + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + zDb, p->zName, + (p->zContentTbl ? "--" : ""), zDb,p->zName + ); /* If everything has worked, invoke fts3DisconnectMethod() to free the ** memory associated with the Fts3Table structure and return SQLITE_OK. @@ -798,10 +812,10 @@ static void fts3Appendf( ** memory. */ static char *fts3QuoteId(char const *zInput){ - int nRet; + sqlite3_int64 nRet; char *zRet; nRet = 2 + (int)strlen(zInput)*2 + 1; - zRet = sqlite3_malloc(nRet); + zRet = sqlite3_malloc64(nRet); if( zRet ){ int i; char *z = zRet; @@ -982,7 +996,7 @@ static int fts3PrefixParameter( } } - aIndex = sqlite3_malloc(sizeof(struct Fts3Index) * nIndex); + aIndex = sqlite3_malloc64(sizeof(struct Fts3Index) * nIndex); *apIndex = aIndex; if( !aIndex ){ return SQLITE_NOMEM; @@ -1061,7 +1075,7 @@ static int fts3ContentColumns( if( rc==SQLITE_OK ){ const char **azCol; /* Output array */ - int nStr = 0; /* Size of all column names (incl. 0x00) */ + sqlite3_int64 nStr = 0; /* Size of all column names (incl. 0x00) */ int nCol; /* Number of table columns */ int i; /* Used to iterate through columns */ @@ -1071,11 +1085,11 @@ static int fts3ContentColumns( nCol = sqlite3_column_count(pStmt); for(i=0; i0 ); if( bDescDoclist ){ - aOut = sqlite3_malloc(*pnRight + FTS3_VARINT_MAX); + aOut = sqlite3_malloc64((sqlite3_int64)*pnRight + FTS3_VARINT_MAX); if( aOut==0 ) return SQLITE_NOMEM; }else{ aOut = aRight; @@ -2782,6 +2810,7 @@ static int fts3TermSelectMerge( pTS->anOutput[0] = nDoclist; if( pTS->aaOutput[0] ){ memcpy(pTS->aaOutput[0], aDoclist, nDoclist); + memset(&pTS->aaOutput[0][nDoclist], 0, FTS3_VARINT_MAX); }else{ return SQLITE_NOMEM; } @@ -2833,8 +2862,8 @@ static int fts3SegReaderCursorAppend( ){ if( (pCsr->nSegment%16)==0 ){ Fts3SegReader **apNew; - int nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*); - apNew = (Fts3SegReader **)sqlite3_realloc(pCsr->apSegment, nByte); + sqlite3_int64 nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*); + apNew = (Fts3SegReader **)sqlite3_realloc64(pCsr->apSegment, nByte); if( !apNew ){ sqlite3Fts3SegReaderFree(pNew); return SQLITE_NOMEM; @@ -2898,7 +2927,7 @@ static int fts3SegReaderCursor( /* If zTerm is not NULL, and this segment is not stored entirely on its ** root node, the range of leaves scanned can be reduced. Do this. */ - if( iStartBlock && zTerm ){ + if( iStartBlock && zTerm && zRoot ){ sqlite3_int64 *pi = (isPrefix ? &iLeavesEndBlock : 0); rc = fts3SelectLeaf(p, zTerm, nTerm, zRoot, nRoot, &iStartBlock, pi); if( rc!=SQLITE_OK ) goto finished; @@ -3840,7 +3869,6 @@ static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ Fts3Table *p = (Fts3Table*)pVtab; UNUSED_PARAMETER(iSavepoint); assert( p->inTransaction ); - assert( p->mxSavepoint >= iSavepoint ); TESTONLY( p->mxSavepoint = iSavepoint ); sqlite3Fts3PendingTermsClear(p); return SQLITE_OK; @@ -4615,9 +4643,10 @@ static int fts3EvalIncrPhraseNext( if( bEof==0 ){ int nList = 0; int nByte = a[p->nToken-1].nList; - char *aDoclist = sqlite3_malloc(nByte+1); + char *aDoclist = sqlite3_malloc(nByte+FTS3_BUFFER_PADDING); if( !aDoclist ) return SQLITE_NOMEM; memcpy(aDoclist, a[p->nToken-1].pList, nByte+1); + memset(&aDoclist[nByte], 0, FTS3_BUFFER_PADDING); for(i=0; i<(p->nToken-1); i++){ if( a[i].bIgnore==0 ){ @@ -5008,7 +5037,7 @@ static int fts3EvalStart(Fts3Cursor *pCsr){ if( rc==SQLITE_OK && nToken>1 && pTab->bFts4 ){ Fts3TokenAndCost *aTC; Fts3Expr **apOr; - aTC = (Fts3TokenAndCost *)sqlite3_malloc( + aTC = (Fts3TokenAndCost *)sqlite3_malloc64( sizeof(Fts3TokenAndCost) * nToken + sizeof(Fts3Expr *) * nOr * 2 ); @@ -5319,7 +5348,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR) ){ Fts3Expr *p; - int nTmp = 0; /* Bytes of temp space */ + sqlite3_int64 nTmp = 0; /* Bytes of temp space */ char *aTmp; /* Temp space for PoslistNearMerge() */ /* Allocate temporary working space. */ @@ -5328,7 +5357,7 @@ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){ nTmp += p->pRight->pPhrase->doclist.nList; } nTmp += p->pPhrase->doclist.nList; - aTmp = sqlite3_malloc(nTmp*2); + aTmp = sqlite3_malloc64(nTmp*2); if( !aTmp ){ *pRc = SQLITE_NOMEM; res = 0; @@ -5598,15 +5627,14 @@ static void fts3EvalRestart( ** found in Fts3Expr.pPhrase->doclist.pList for each of the phrase ** expression nodes. */ -static void fts3EvalUpdateCounts(Fts3Expr *pExpr){ +static void fts3EvalUpdateCounts(Fts3Expr *pExpr, int nCol){ if( pExpr ){ Fts3Phrase *pPhrase = pExpr->pPhrase; if( pPhrase && pPhrase->doclist.pList ){ int iCol = 0; char *p = pPhrase->doclist.pList; - assert( *p ); - while( 1 ){ + do{ u8 c = 0; int iCnt = 0; while( 0xFE & (*p | c) ){ @@ -5622,11 +5650,11 @@ static void fts3EvalUpdateCounts(Fts3Expr *pExpr){ if( *p==0x00 ) break; p++; p += fts3GetVarint32(p, &iCol); - } + }while( iColpLeft); - fts3EvalUpdateCounts(pExpr->pRight); + fts3EvalUpdateCounts(pExpr->pLeft, nCol); + fts3EvalUpdateCounts(pExpr->pRight, nCol); } } @@ -5670,7 +5698,7 @@ static int fts3EvalGatherStats( for(p=pRoot; p; p=p->pLeft){ Fts3Expr *pE = (p->eType==FTSQUERY_PHRASE?p:p->pRight); assert( pE->aMI==0 ); - pE->aMI = (u32 *)sqlite3_malloc(pTab->nColumn * 3 * sizeof(u32)); + pE->aMI = (u32 *)sqlite3_malloc64(pTab->nColumn * 3 * sizeof(u32)); if( !pE->aMI ) return SQLITE_NOMEM; memset(pE->aMI, 0, pTab->nColumn * 3 * sizeof(u32)); } @@ -5696,7 +5724,7 @@ static int fts3EvalGatherStats( ); if( rc==SQLITE_OK && pCsr->isEof==0 ){ - fts3EvalUpdateCounts(pRoot); + fts3EvalUpdateCounts(pRoot, pTab->nColumn); } } diff --git a/ext/fts3/fts3Int.h b/ext/fts3/fts3Int.h index 077bad7..9436e16 100644 --- a/ext/fts3/fts3Int.h +++ b/ext/fts3/fts3Int.h @@ -95,6 +95,8 @@ SQLITE_EXTENSION_INIT3 */ #define FTS3_VARINT_MAX 10 +#define FTS3_BUFFER_PADDING 8 + /* ** FTS4 virtual tables may maintain multiple indexes - one index of all terms ** in the document set and zero or more prefix indexes. All indexes are stored @@ -127,6 +129,18 @@ SQLITE_EXTENSION_INIT3 #define POS_COLUMN (1) /* Column-list terminator */ #define POS_END (0) /* Position-list terminator */ +/* +** The assert_fts3_nc() macro is similar to the assert() macro, except that it +** is used for assert() conditions that are true only if it can be +** guranteed that the database is not corrupt. +*/ +#if defined(SQLITE_DEBUG) || defined(SQLITE_TEST) +extern int sqlite3_fts3_may_be_corrupt; +# define assert_fts3_nc(x) assert(sqlite3_fts3_may_be_corrupt || (x)) +#else +# define assert_fts3_nc(x) assert(x) +#endif + /* ** This section provides definitions to allow the ** FTS3 extension to be compiled outside of the diff --git a/ext/fts3/fts3_aux.c b/ext/fts3/fts3_aux.c index 54aea6f..08edc00 100644 --- a/ext/fts3/fts3_aux.c +++ b/ext/fts3/fts3_aux.c @@ -66,7 +66,7 @@ static int fts3auxConnectMethod( char const *zFts3; /* Name of fts3 table */ int nDb; /* Result of strlen(zDb) */ int nFts3; /* Result of strlen(zFts3) */ - int nByte; /* Bytes of space to allocate here */ + sqlite3_int64 nByte; /* Bytes of space to allocate here */ int rc; /* value returned by declare_vtab() */ Fts3auxTable *p; /* Virtual table object to return */ @@ -98,7 +98,7 @@ static int fts3auxConnectMethod( if( rc!=SQLITE_OK ) return rc; nByte = sizeof(Fts3auxTable) + sizeof(Fts3Table) + nDb + nFts3 + 2; - p = (Fts3auxTable *)sqlite3_malloc(nByte); + p = (Fts3auxTable *)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, nByte); @@ -248,7 +248,7 @@ static int fts3auxCloseMethod(sqlite3_vtab_cursor *pCursor){ static int fts3auxGrowStatArray(Fts3auxCursor *pCsr, int nSize){ if( nSize>pCsr->nStat ){ struct Fts3auxColstats *aNew; - aNew = (struct Fts3auxColstats *)sqlite3_realloc(pCsr->aStat, + aNew = (struct Fts3auxColstats *)sqlite3_realloc64(pCsr->aStat, sizeof(struct Fts3auxColstats) * nSize ); if( aNew==0 ) return SQLITE_NOMEM; @@ -416,15 +416,15 @@ static int fts3auxFilterMethod( assert( (iEq==0 && iGe==-1) || (iEq==-1 && iGe==0) ); if( zStr ){ pCsr->filter.zTerm = sqlite3_mprintf("%s", zStr); - pCsr->filter.nTerm = sqlite3_value_bytes(apVal[0]); if( pCsr->filter.zTerm==0 ) return SQLITE_NOMEM; + pCsr->filter.nTerm = (int)strlen(pCsr->filter.zTerm); } } if( iLe>=0 ){ pCsr->zStop = sqlite3_mprintf("%s", sqlite3_value_text(apVal[iLe])); - pCsr->nStop = sqlite3_value_bytes(apVal[iLe]); if( pCsr->zStop==0 ) return SQLITE_NOMEM; + pCsr->nStop = (int)strlen(pCsr->zStop); } if( iLangid>=0 ){ diff --git a/ext/fts3/fts3_expr.c b/ext/fts3/fts3_expr.c index 9f42b44..5775fbc 100644 --- a/ext/fts3/fts3_expr.c +++ b/ext/fts3/fts3_expr.c @@ -122,8 +122,8 @@ static int fts3isspace(char c){ ** zero the memory before returning a pointer to it. If unsuccessful, ** return NULL. */ -static void *fts3MallocZero(int nByte){ - void *pRet = sqlite3_malloc(nByte); +static void *fts3MallocZero(sqlite3_int64 nByte){ + void *pRet = sqlite3_malloc64(nByte); if( pRet ) memset(pRet, 0, nByte); return pRet; } @@ -198,7 +198,7 @@ static int getNextToken( if( rc==SQLITE_OK ){ const char *zToken; int nToken = 0, iStart = 0, iEnd = 0, iPosition = 0; - int nByte; /* total space to allocate */ + sqlite3_int64 nByte; /* total space to allocate */ rc = pModule->xNext(pCursor, &zToken, &nToken, &iStart, &iEnd, &iPosition); if( rc==SQLITE_OK ){ @@ -252,8 +252,8 @@ static int getNextToken( ** Enlarge a memory allocation. If an out-of-memory allocation occurs, ** then free the old allocation. */ -static void *fts3ReallocOrFree(void *pOrig, int nNew){ - void *pRet = sqlite3_realloc(pOrig, nNew); +static void *fts3ReallocOrFree(void *pOrig, sqlite3_int64 nNew){ + void *pRet = sqlite3_realloc64(pOrig, nNew); if( !pRet ){ sqlite3_free(pOrig); } @@ -497,7 +497,6 @@ static int getNextNode( int nConsumed = 0; pParse->nNest++; rc = fts3ExprParse(pParse, zInput+1, nInput-1, ppExpr, &nConsumed); - if( rc==SQLITE_OK && !*ppExpr ){ rc = SQLITE_DONE; } *pnConsumed = (int)(zInput - z) + 1 + nConsumed; return rc; }else if( *zInput==')' ){ @@ -796,7 +795,7 @@ static int fts3ExprBalance(Fts3Expr **pp, int nMaxDepth){ if( rc==SQLITE_OK ){ if( (eType==FTSQUERY_AND || eType==FTSQUERY_OR) ){ Fts3Expr **apLeaf; - apLeaf = (Fts3Expr **)sqlite3_malloc(sizeof(Fts3Expr *) * nMaxDepth); + apLeaf = (Fts3Expr **)sqlite3_malloc64(sizeof(Fts3Expr *) * nMaxDepth); if( 0==apLeaf ){ rc = SQLITE_NOMEM; }else{ @@ -1216,7 +1215,7 @@ static void fts3ExprTestCommon( zExpr = (const char *)sqlite3_value_text(argv[1]); nExpr = sqlite3_value_bytes(argv[1]); nCol = argc-2; - azCol = (char **)sqlite3_malloc(nCol*sizeof(char *)); + azCol = (char **)sqlite3_malloc64(nCol*sizeof(char *)); if( !azCol ){ sqlite3_result_error_nomem(context); goto exprtest_out; diff --git a/ext/fts3/fts3_hash.c b/ext/fts3/fts3_hash.c index 1a32a53..63e55b3 100644 --- a/ext/fts3/fts3_hash.c +++ b/ext/fts3/fts3_hash.c @@ -35,8 +35,8 @@ /* ** Malloc and Free functions */ -static void *fts3HashMalloc(int n){ - void *p = sqlite3_malloc(n); +static void *fts3HashMalloc(sqlite3_int64 n){ + void *p = sqlite3_malloc64(n); if( p ){ memset(p, 0, n); } diff --git a/ext/fts3/fts3_icu.c b/ext/fts3/fts3_icu.c index 6f90e1e..0848a5a 100644 --- a/ext/fts3/fts3_icu.c +++ b/ext/fts3/fts3_icu.c @@ -60,7 +60,7 @@ static int icuCreate( if( argc>0 ){ n = strlen(argv[0])+1; } - p = (IcuTokenizer *)sqlite3_malloc(sizeof(IcuTokenizer)+n); + p = (IcuTokenizer *)sqlite3_malloc64(sizeof(IcuTokenizer)+n); if( !p ){ return SQLITE_NOMEM; } @@ -117,7 +117,7 @@ static int icuOpen( nInput = strlen(zInput); } nChar = nInput+1; - pCsr = (IcuCursor *)sqlite3_malloc( + pCsr = (IcuCursor *)sqlite3_malloc64( sizeof(IcuCursor) + /* IcuCursor */ ((nChar+3)&~3) * sizeof(UChar) + /* IcuCursor.aChar[] */ (nChar+1) * sizeof(int) /* IcuCursor.aOffset[] */ diff --git a/ext/fts3/fts3_snippet.c b/ext/fts3/fts3_snippet.c index a0771c0..115e98a 100644 --- a/ext/fts3/fts3_snippet.c +++ b/ext/fts3/fts3_snippet.c @@ -178,7 +178,7 @@ static void (*fts3MIBufferAlloc(MatchinfoBuffer *p, u32 **paOut))(void*){ aOut = &p->aMatchinfo[p->nElem+2]; xRet = fts3MIBufferFree; }else{ - aOut = (u32*)sqlite3_malloc(p->nElem * sizeof(u32)); + aOut = (u32*)sqlite3_malloc64(p->nElem * sizeof(u32)); if( aOut ){ xRet = sqlite3_free; if( p->bGlobal ) memcpy(aOut, &p->aMatchinfo[1], p->nElem*sizeof(u32)); @@ -433,7 +433,8 @@ static void fts3SnippetDetails( int j; u64 mPhrase = (u64)1 << i; u64 mPos = (u64)1 << (iCsr - iStart); - assert( iCsr>=iStart ); + assert( iCsr>=iStart && (iCsr - iStart)<=64 ); + assert( i>=0 && i<=64 ); if( (mCover|mCovered)&mPhrase ){ iScore++; }else{ @@ -475,11 +476,14 @@ static int fts3SnippetFindPositions(Fts3Expr *pExpr, int iPhrase, void *ctx){ int iFirst = 0; pPhrase->pList = pCsr; fts3GetDeltaPosition(&pCsr, &iFirst); - assert( iFirst>=0 ); - pPhrase->pHead = pCsr; - pPhrase->pTail = pCsr; - pPhrase->iHead = iFirst; - pPhrase->iTail = iFirst; + if( iFirst<0 ){ + rc = FTS_CORRUPT_VTAB; + }else{ + pPhrase->pHead = pCsr; + pPhrase->pTail = pCsr; + pPhrase->iHead = iFirst; + pPhrase->iTail = iFirst; + } }else{ assert( rc!=SQLITE_OK || ( pPhrase->pList==0 && pPhrase->pHead==0 && pPhrase->pTail==0 @@ -516,7 +520,7 @@ static int fts3BestSnippet( int rc; /* Return Code */ int nList; /* Number of phrases in expression */ SnippetIter sIter; /* Iterates through snippet candidates */ - int nByte; /* Number of bytes of space to allocate */ + sqlite3_int64 nByte; /* Number of bytes of space to allocate */ int iBestScore = -1; /* Best snippet score found so far */ int i; /* Loop counter */ @@ -534,7 +538,7 @@ static int fts3BestSnippet( ** the required space using malloc(). */ nByte = sizeof(SnippetPhrase) * nList; - sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc(nByte); + sIter.aPhrase = (SnippetPhrase *)sqlite3_malloc64(nByte); if( !sIter.aPhrase ){ return SQLITE_NOMEM; } @@ -604,8 +608,8 @@ static int fts3StringAppend( ** appended data. */ if( pStr->n+nAppend+1>=pStr->nAlloc ){ - int nAlloc = pStr->nAlloc+nAppend+100; - char *zNew = sqlite3_realloc(pStr->z, nAlloc); + sqlite3_int64 nAlloc = pStr->nAlloc+(sqlite3_int64)nAppend+100; + char *zNew = sqlite3_realloc64(pStr->z, nAlloc); if( !zNew ){ return SQLITE_NOMEM; } @@ -660,6 +664,7 @@ static int fts3SnippetShift( for(nLeft=0; !(hlmask & ((u64)1 << nLeft)); nLeft++); for(nRight=0; !(hlmask & ((u64)1 << (nSnippet-1-nRight))); nRight++); + assert( (nSnippet-1-nRight)<=63 && (nSnippet-1-nRight)>=0 ); nDesired = (nLeft-nRight)/2; /* Ideally, the start of the snippet should be pushed forward in the @@ -852,7 +857,7 @@ static int fts3ColumnlistCount(char **ppCollist){ /* ** This function gathers 'y' or 'b' data for a single phrase. */ -static void fts3ExprLHits( +static int fts3ExprLHits( Fts3Expr *pExpr, /* Phrase expression node */ MatchInfo *p /* Matchinfo context */ ){ @@ -882,25 +887,29 @@ static void fts3ExprLHits( if( *pIter!=0x01 ) break; pIter++; pIter += fts3GetVarint32(pIter, &iCol); + if( iCol>=p->nCol ) return FTS_CORRUPT_VTAB; } + return SQLITE_OK; } /* ** Gather the results for matchinfo directives 'y' and 'b'. */ -static void fts3ExprLHitGather( +static int fts3ExprLHitGather( Fts3Expr *pExpr, MatchInfo *p ){ + int rc = SQLITE_OK; assert( (pExpr->pLeft==0)==(pExpr->pRight==0) ); if( pExpr->bEof==0 && pExpr->iDocid==p->pCursor->iPrevId ){ if( pExpr->pLeft ){ - fts3ExprLHitGather(pExpr->pLeft, p); - fts3ExprLHitGather(pExpr->pRight, p); + rc = fts3ExprLHitGather(pExpr->pLeft, p); + if( rc==SQLITE_OK ) rc = fts3ExprLHitGather(pExpr->pRight, p); }else{ - fts3ExprLHits(pExpr, p); + rc = fts3ExprLHits(pExpr, p); } } + return rc; } /* @@ -1117,11 +1126,12 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ int i; int iCol; int nToken = 0; + int rc = SQLITE_OK; /* Allocate and populate the array of LcsIterator objects. The array ** contains one element for each matchable phrase in the query. **/ - aIter = sqlite3_malloc(sizeof(LcsIterator) * pCsr->nPhrase); + aIter = sqlite3_malloc64(sizeof(LcsIterator) * pCsr->nPhrase); if( !aIter ) return SQLITE_NOMEM; memset(aIter, 0, sizeof(LcsIterator) * pCsr->nPhrase); (void)fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter); @@ -1137,13 +1147,16 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ int nLive = 0; /* Number of iterators in aIter not at EOF */ for(i=0; inPhrase; i++){ - int rc; LcsIterator *pIt = &aIter[i]; rc = sqlite3Fts3EvalPhrasePoslist(pCsr, pIt->pExpr, iCol, &pIt->pRead); - if( rc!=SQLITE_OK ) return rc; + if( rc!=SQLITE_OK ) goto matchinfo_lcs_out; if( pIt->pRead ){ pIt->iPos = pIt->iPosOffset; - fts3LcsIteratorAdvance(&aIter[i]); + fts3LcsIteratorAdvance(pIt); + if( pIt->pRead==0 ){ + rc = FTS_CORRUPT_VTAB; + goto matchinfo_lcs_out; + } nLive++; } } @@ -1175,8 +1188,9 @@ static int fts3MatchinfoLcs(Fts3Cursor *pCsr, MatchInfo *pInfo){ pInfo->aMatchinfo[iCol] = nLcs; } + matchinfo_lcs_out: sqlite3_free(aIter); - return SQLITE_OK; + return rc; } /* @@ -1272,7 +1286,7 @@ static int fts3MatchinfoValues( case FTS3_MATCHINFO_LHITS: { int nZero = fts3MatchinfoSize(pInfo, zArg[i]) * sizeof(u32); memset(pInfo->aMatchinfo, 0, nZero); - fts3ExprLHitGather(pCsr->pExpr, pInfo); + rc = fts3ExprLHitGather(pCsr->pExpr, pInfo); break; } @@ -1424,6 +1438,10 @@ void sqlite3Fts3Snippet( return; } + /* Limit the snippet length to 64 tokens. */ + if( nToken<-64 ) nToken = -64; + if( nToken>+64 ) nToken = +64; + for(nSnippet=1; 1; nSnippet++){ int iSnip; /* Loop counter 0..nSnippet-1 */ @@ -1566,7 +1584,7 @@ void sqlite3Fts3Offsets( if( rc!=SQLITE_OK ) goto offsets_out; /* Allocate the array of TermOffset iterators. */ - sCtx.aTerm = (TermOffset *)sqlite3_malloc(sizeof(TermOffset)*nToken); + sCtx.aTerm = (TermOffset *)sqlite3_malloc64(sizeof(TermOffset)*nToken); if( 0==sCtx.aTerm ){ rc = SQLITE_NOMEM; goto offsets_out; diff --git a/ext/fts3/fts3_term.c b/ext/fts3/fts3_term.c index aaa2404..e837219 100644 --- a/ext/fts3/fts3_term.c +++ b/ext/fts3/fts3_term.c @@ -68,9 +68,9 @@ static int fts3termConnectMethod( char const *zFts3; /* Name of fts3 table */ int nDb; /* Result of strlen(zDb) */ int nFts3; /* Result of strlen(zFts3) */ - int nByte; /* Bytes of space to allocate here */ + sqlite3_int64 nByte; /* Bytes of space to allocate here */ int rc; /* value returned by declare_vtab() */ - Fts3termTable *p; /* Virtual table object to return */ + Fts3termTable *p; /* Virtual table object to return */ int iIndex = 0; UNUSED_PARAMETER(pCtx); @@ -96,7 +96,7 @@ static int fts3termConnectMethod( if( rc!=SQLITE_OK ) return rc; nByte = sizeof(Fts3termTable) + sizeof(Fts3Table) + nDb + nFts3 + 2; - p = (Fts3termTable *)sqlite3_malloc(nByte); + p = (Fts3termTable *)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, nByte); diff --git a/ext/fts3/fts3_test.c b/ext/fts3/fts3_test.c index a48a556..8bf7804 100644 --- a/ext/fts3/fts3_test.c +++ b/ext/fts3/fts3_test.c @@ -574,6 +574,33 @@ static int SQLITE_TCLAPI fts3_test_varint_cmd( ** End of tokenizer code. **************************************************************************/ +/* +** sqlite3_fts3_may_be_corrupt BOOLEAN +** +** Set or clear the global "may-be-corrupt" flag. Return the old value. +*/ +static int SQLITE_TCLAPI fts3_may_be_corrupt( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + int bOld = sqlite3_fts3_may_be_corrupt; + + if( objc!=2 && objc!=1 ){ + Tcl_WrongNumArgs(interp, 1, objv, "?BOOLEAN?"); + return TCL_ERROR; + } + if( objc==2 ){ + int bNew; + if( Tcl_GetBooleanFromObj(interp, objv[1], &bNew) ) return TCL_ERROR; + sqlite3_fts3_may_be_corrupt = bNew; + } + + Tcl_SetObjResult(interp, Tcl_NewIntObj(bOld)); + return TCL_OK; +} + int Sqlitetestfts3_Init(Tcl_Interp *interp){ Tcl_CreateObjCommand(interp, "fts3_near_match", fts3_near_match_cmd, 0, 0); Tcl_CreateObjCommand(interp, @@ -582,10 +609,12 @@ int Sqlitetestfts3_Init(Tcl_Interp *interp){ Tcl_CreateObjCommand( interp, "fts3_test_tokenizer", fts3_test_tokenizer_cmd, 0, 0 ); - Tcl_CreateObjCommand( interp, "fts3_test_varint", fts3_test_varint_cmd, 0, 0 ); + Tcl_CreateObjCommand( + interp, "sqlite3_fts3_may_be_corrupt", fts3_may_be_corrupt, 0, 0 + ); return TCL_OK; } #endif /* SQLITE_ENABLE_FTS3 || SQLITE_ENABLE_FTS4 */ diff --git a/ext/fts3/fts3_tokenize_vtab.c b/ext/fts3/fts3_tokenize_vtab.c index a3d24bc..b5bf8ad 100644 --- a/ext/fts3/fts3_tokenize_vtab.c +++ b/ext/fts3/fts3_tokenize_vtab.c @@ -122,7 +122,7 @@ static int fts3tokDequoteArray( nByte += (int)(strlen(argv[i]) + 1); } - *pazDequote = azDequote = sqlite3_malloc(sizeof(char *)*argc + nByte); + *pazDequote = azDequote = sqlite3_malloc64(sizeof(char *)*argc + nByte); if( azDequote==0 ){ rc = SQLITE_NOMEM; }else{ diff --git a/ext/fts3/fts3_unicode.c b/ext/fts3/fts3_unicode.c index dfb2680..b06d992 100644 --- a/ext/fts3/fts3_unicode.c +++ b/ext/fts3/fts3_unicode.c @@ -82,7 +82,7 @@ typedef struct unicode_cursor unicode_cursor; struct unicode_tokenizer { sqlite3_tokenizer base; - int bRemoveDiacritic; + int eRemoveDiacritic; int nException; int *aiException; }; @@ -155,7 +155,7 @@ static int unicodeAddExceptions( int *aNew; /* New aiException[] array */ int nNew; /* Number of valid entries in array aNew[] */ - aNew = sqlite3_realloc(p->aiException, (p->nException+nEntry)*sizeof(int)); + aNew = sqlite3_realloc64(p->aiException,(p->nException+nEntry)*sizeof(int)); if( aNew==0 ) return SQLITE_NOMEM; nNew = p->nException; @@ -227,17 +227,20 @@ static int unicodeCreate( pNew = (unicode_tokenizer *) sqlite3_malloc(sizeof(unicode_tokenizer)); if( pNew==NULL ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(unicode_tokenizer)); - pNew->bRemoveDiacritic = 1; + pNew->eRemoveDiacritic = 1; for(i=0; rc==SQLITE_OK && ibRemoveDiacritic = 1; + pNew->eRemoveDiacritic = 1; } else if( n==19 && memcmp("remove_diacritics=0", z, 19)==0 ){ - pNew->bRemoveDiacritic = 0; + pNew->eRemoveDiacritic = 0; + } + else if( n==19 && memcmp("remove_diacritics=2", z, 19)==0 ){ + pNew->eRemoveDiacritic = 2; } else if( n>=11 && memcmp("tokenchars=", z, 11)==0 ){ rc = unicodeAddExceptions(pNew, 1, &z[11], n-11); @@ -341,7 +344,7 @@ static int unicodeNext( /* Grow the output buffer if required. */ if( (zOut-pCsr->zToken)>=(pCsr->nAlloc-4) ){ - char *zNew = sqlite3_realloc(pCsr->zToken, pCsr->nAlloc+64); + char *zNew = sqlite3_realloc64(pCsr->zToken, pCsr->nAlloc+64); if( !zNew ) return SQLITE_NOMEM; zOut = &zNew[zOut - pCsr->zToken]; pCsr->zToken = zNew; @@ -350,7 +353,7 @@ static int unicodeNext( /* Write the folded case of the last character read to the output */ zEnd = z; - iOut = sqlite3FtsUnicodeFold((int)iCode, p->bRemoveDiacritic); + iOut = sqlite3FtsUnicodeFold((int)iCode, p->eRemoveDiacritic); if( iOut ){ WRITE_UTF8(zOut, iOut); } diff --git a/ext/fts3/fts3_unicode2.c b/ext/fts3/fts3_unicode2.c index da7251e..c510162 100644 --- a/ext/fts3/fts3_unicode2.c +++ b/ext/fts3/fts3_unicode2.c @@ -1,5 +1,5 @@ /* -** 2012 May 25 +** 2012-05-25 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -159,32 +159,48 @@ int sqlite3FtsUnicodeIsalnum(int c){ ** E"). The resuls of passing a codepoint that corresponds to an ** uppercase letter are undefined. */ -static int remove_diacritic(int c){ +static int remove_diacritic(int c, int bComplex){ unsigned short aDia[] = { 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, - 3456, 3696, 3712, 3728, 3744, 3896, 3912, 3928, - 3968, 4008, 4040, 4106, 4138, 4170, 4202, 4234, - 4266, 4296, 4312, 4344, 4408, 4424, 4472, 4504, - 6148, 6198, 6264, 6280, 6360, 6429, 6505, 6529, - 61448, 61468, 61534, 61592, 61642, 61688, 61704, 61726, - 61784, 61800, 61836, 61880, 61914, 61948, 61998, 62122, - 62154, 62200, 62218, 62302, 62364, 62442, 62478, 62536, - 62554, 62584, 62604, 62640, 62648, 62656, 62664, 62730, - 62924, 63050, 63082, 63274, 63390, + 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, + 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, + 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, + 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, + 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, + 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, + 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, + 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, + 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, + 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, + 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, + 63182, 63242, 63274, 63310, 63368, 63390, }; - char aChar[] = { - '\0', 'a', 'c', 'e', 'i', 'n', 'o', 'u', 'y', 'y', 'a', 'c', - 'd', 'e', 'e', 'g', 'h', 'i', 'j', 'k', 'l', 'n', 'o', 'r', - 's', 't', 'u', 'u', 'w', 'y', 'z', 'o', 'u', 'a', 'i', 'o', - 'u', 'g', 'k', 'o', 'j', 'g', 'n', 'a', 'e', 'i', 'o', 'r', - 'u', 's', 't', 'h', 'a', 'e', 'o', 'y', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', 'a', 'b', 'd', 'd', 'e', 'f', 'g', 'h', - 'h', 'i', 'k', 'l', 'l', 'm', 'n', 'p', 'r', 'r', 's', 't', - 'u', 'v', 'w', 'w', 'x', 'y', 'z', 'h', 't', 'w', 'y', 'a', - 'e', 'i', 'o', 'u', 'y', +#define HIBIT ((unsigned char)0x80) + unsigned char aChar[] = { + '\0', 'a', 'c', 'e', 'i', 'n', + 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', + 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', + 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', + 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', + 'e', 'i', 'o', 'r', 'u', 's', + 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', + 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', + 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, + 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, + 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', + 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', + 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', + 'w', 'x', 'y', 'z', 'h', 't', + 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, + 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, + 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', }; unsigned int key = (((unsigned int)c)<<3) | 0x00000007; @@ -201,7 +217,8 @@ static int remove_diacritic(int c){ } } assert( key>=aDia[iRes] ); - return ((c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : (int)aChar[iRes]); + if( bComplex==0 && (aChar[iRes] & 0x80) ) return c; + return (c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : ((int)aChar[iRes] & 0x7F); } @@ -214,8 +231,8 @@ int sqlite3FtsUnicodeIsdiacritic(int c){ unsigned int mask1 = 0x000361F8; if( c<768 || c>817 ) return 0; return (c < 768+32) ? - (mask0 & (1 << (c-768))) : - (mask1 & (1 << (c-768-32))); + (mask0 & ((unsigned int)1 << (c-768))) : + (mask1 & ((unsigned int)1 << (c-768-32))); } @@ -228,7 +245,7 @@ int sqlite3FtsUnicodeIsdiacritic(int c){ ** The results are undefined if the value passed to this function ** is less than zero. */ -int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ +int sqlite3FtsUnicodeFold(int c, int eRemoveDiacritic){ /* Each entry in the following array defines a rule for folding a range ** of codepoints to lower case. The rule applies to a range of nRange ** codepoints starting at codepoint iCode. @@ -351,7 +368,9 @@ int sqlite3FtsUnicodeFold(int c, int bRemoveDiacritic){ assert( ret>0 ); } - if( bRemoveDiacritic ) ret = remove_diacritic(ret); + if( eRemoveDiacritic ){ + ret = remove_diacritic(ret, eRemoveDiacritic==2); + } } else if( c>=66560 && c<66600 ){ diff --git a/ext/fts3/fts3_write.c b/ext/fts3/fts3_write.c index 8fc6589..031b7b3 100644 --- a/ext/fts3/fts3_write.c +++ b/ext/fts3/fts3_write.c @@ -396,10 +396,12 @@ static int fts3SqlStmt( pStmt = p->aStmt[eStmt]; if( !pStmt ){ + int f = SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB; char *zSql; if( eStmt==SQL_CONTENT_INSERT ){ zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName, p->zWriteExprlist); }else if( eStmt==SQL_SELECT_CONTENT_BY_ROWID ){ + f &= ~SQLITE_PREPARE_NO_VTAB; zSql = sqlite3_mprintf(azSql[eStmt], p->zReadExprlist); }else{ zSql = sqlite3_mprintf(azSql[eStmt], p->zDb, p->zName); @@ -407,8 +409,7 @@ static int fts3SqlStmt( if( !zSql ){ rc = SQLITE_NOMEM; }else{ - rc = sqlite3_prepare_v3(p->db, zSql, -1, SQLITE_PREPARE_PERSISTENT, - &pStmt, NULL); + rc = sqlite3_prepare_v3(p->db, zSql, -1, f, &pStmt, NULL); sqlite3_free(zSql); assert( rc==SQLITE_OK || pStmt==0 ); p->aStmt[eStmt] = pStmt; @@ -566,7 +567,7 @@ static sqlite3_int64 getAbsoluteLevel( int iLevel /* Level of segments */ ){ sqlite3_int64 iBase; /* First absolute level for iLangid/iIndex */ - assert( iLangid>=0 ); + assert_fts3_nc( iLangid>=0 ); assert( p->nIndex>0 ); assert( iIndex>=0 && iIndexnIndex ); @@ -1408,7 +1409,7 @@ static int fts3SegReaderNext( ** b-tree node. And that the final byte of the doclist is 0x00. If either ** of these statements is untrue, then the data structure is corrupt. */ - if( (&pReader->aNode[pReader->nNode] - pReader->aDoclist)nDoclist + if( pReader->nDoclist > pReader->nNode-(pReader->aDoclist-pReader->aNode) || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1]) ){ return FTS_CORRUPT_VTAB; @@ -1608,8 +1609,13 @@ int sqlite3Fts3SegReaderNew( Fts3SegReader *pReader; /* Newly allocated SegReader object */ int nExtra = 0; /* Bytes to allocate segment root node */ - assert( iStartLeaf<=iEndLeaf ); + assert( zRoot!=0 || nRoot==0 ); +#ifdef CORRUPT_DB + assert( zRoot!=0 || CORRUPT_DB ); +#endif + if( iStartLeaf==0 ){ + if( iEndLeaf!=0 ) return FTS_CORRUPT_VTAB; nExtra = nRoot + FTS3_NODE_PADDING; } @@ -1629,7 +1635,7 @@ int sqlite3Fts3SegReaderNew( pReader->aNode = (char *)&pReader[1]; pReader->rootOnly = 1; pReader->nNode = nRoot; - memcpy(pReader->aNode, zRoot, nRoot); + if( nRoot ) memcpy(pReader->aNode, zRoot, nRoot); memset(&pReader->aNode[nRoot], 0, FTS3_NODE_PADDING); }else{ pReader->iCurrentBlock = iStartLeaf-1; @@ -2249,6 +2255,11 @@ static int fts3SegWriterAdd( nPrefix = fts3PrefixCompress(pWriter->zTerm, pWriter->nTerm, zTerm, nTerm); nSuffix = nTerm-nPrefix; + /* If nSuffix is zero or less, then zTerm/nTerm must be a prefix of + ** pWriter->zTerm/pWriter->nTerm. i.e. must be equal to or less than when + ** compared with BINARY collation. This indicates corruption. */ + if( nSuffix<=0 ) return FTS_CORRUPT_VTAB; + /* Figure out how many bytes are required by this new entry */ nReq = sqlite3Fts3VarintLen(nPrefix) + /* varint containing prefix size */ sqlite3Fts3VarintLen(nSuffix) + /* varint containing suffix size */ @@ -2956,7 +2967,9 @@ int sqlite3Fts3SegReaderStep( }else{ iDelta = iDocid - iPrev; } - assert( iDelta>0 || (nDoclist==0 && iDelta==iDocid) ); + if( iDelta<=0 && (nDoclist>0 || iDelta!=iDocid) ){ + return FTS_CORRUPT_VTAB; + } assert( nDoclist>0 || iDelta==iDocid ); nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0); @@ -3322,14 +3335,16 @@ static void fts3DecodeIntArray( const char *zBuf, /* The BLOB containing the varints */ int nBuf /* size of the BLOB */ ){ - int i, j; - UNUSED_PARAMETER(nBuf); - for(i=j=0; iiOff += fts3GetVarint32(&p->aNode[p->iOff], &nSuffix); if( nPrefix>p->iOff || nSuffix>p->nNode-p->iOff ){ - return SQLITE_CORRUPT_VTAB; + return FTS_CORRUPT_VTAB; } blobGrowBuffer(&p->term, nPrefix+nSuffix, &rc); if( rc==SQLITE_OK ){ @@ -3745,7 +3760,7 @@ static int nodeReaderNext(NodeReader *p){ if( p->iChild==0 ){ p->iOff += fts3GetVarint32(&p->aNode[p->iOff], &p->nDoclist); if( (p->nNode-p->iOff)nDoclist ){ - return SQLITE_CORRUPT_VTAB; + return FTS_CORRUPT_VTAB; } p->aDoclist = &p->aNode[p->iOff]; p->iOff += p->nDoclist; diff --git a/ext/fts3/unicode/mkunicode.tcl b/ext/fts3/unicode/mkunicode.tcl index 84b8ddc..7e24aaa 100644 --- a/ext/fts3/unicode/mkunicode.tcl +++ b/ext/fts3/unicode/mkunicode.tcl @@ -9,11 +9,12 @@ proc print_rd {map} { set nRange 1 set iFirst [lindex $map 0 0] set cPrev [lindex $map 0 1] + set fPrev [lindex $map 0 2] foreach m [lrange $map 1 end] { - foreach {i c} $m {} + foreach {i c f} $m {} - if {$cPrev == $c} { + if {$cPrev == $c && $fPrev==$f} { for {set j [expr $iFirst+$nRange]} {$j<$i} {incr j} { if {[info exists tl_lookup_table($j)]==0} break } @@ -29,13 +30,16 @@ proc print_rd {map} { lappend lRange [list $iFirst $nRange] lappend aChar $cPrev + lappend aFlag $fPrev set iFirst $i set cPrev $c + set fPrev $f set nRange 1 } lappend lRange [list $iFirst $nRange] lappend aChar $cPrev + lappend aFlag $fPrev puts "/*" puts "** If the argument is a codepoint corresponding to a lowercase letter" @@ -45,7 +49,7 @@ proc print_rd {map} { puts "** E\"). The resuls of passing a codepoint that corresponds to an" puts "** uppercase letter are undefined." puts "*/" - puts "static int ${::remove_diacritic}(int c)\{" + puts "static int ${::remove_diacritic}(int c, int bComplex)\{" puts " unsigned short aDia\[\] = \{" puts -nonewline " 0, " set i 1 @@ -59,14 +63,19 @@ proc print_rd {map} { } puts "" puts " \};" - puts " char aChar\[\] = \{" - puts -nonewline " '\\0', " + puts "#define HIBIT ((unsigned char)0x80)" + puts " unsigned char aChar\[\] = \{" + puts -nonewline " '\\0', " set i 1 - foreach c $aChar { - set str "'$c', " - if {$c == ""} { set str "'\\0', " } + foreach c $aChar f $aFlag { + if { $f } { + set str "'$c'|HIBIT, " + } else { + set str "'$c', " + } + if {$c == ""} { set str "'\\0', " } - if {($i % 12)==0} {puts "" ; puts -nonewline " " } + if {($i % 6)==0} {puts "" ; puts -nonewline " " } incr i puts -nonewline "$str" } @@ -87,7 +96,8 @@ proc print_rd {map} { } } assert( key>=aDia[iRes] ); - return ((c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : (int)aChar[iRes]);} + if( bComplex==0 && (aChar[iRes] & 0x80) ) return c; + return (c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : ((int)aChar[iRes] & 0x7F);} puts "\}" } @@ -95,7 +105,8 @@ proc print_isdiacritic {zFunc map} { set lCode [list] foreach m $map { - foreach {code char} $m {} + foreach {code char flag} $m {} + if {$flag} continue if {$code && $char == ""} { lappend lCode $code } } set lCode [lsort -integer $lCode] @@ -124,8 +135,8 @@ proc print_isdiacritic {zFunc map} { puts " if( c<$iFirst || c>$iLast ) return 0;" puts " return (c < $iFirst+32) ?" - puts " (mask0 & (1 << (c-$iFirst))) :" - puts " (mask1 & (1 << (c-$iFirst-32)));" + puts " (mask0 & ((unsigned int)1 << (c-$iFirst))) :" + puts " (mask1 & ((unsigned int)1 << (c-$iFirst-32)));" puts "\}" } @@ -472,7 +483,7 @@ proc print_fold {zFunc} { puts "** The results are undefined if the value passed to this function" puts "** is less than zero." puts "*/" - puts "int ${zFunc}\(int c, int bRemoveDiacritic)\{" + puts "int ${zFunc}\(int c, int eRemoveDiacritic)\{" set liOff [tl_generate_ioff_table $lRecord] tl_print_table_header @@ -516,7 +527,9 @@ proc print_fold {zFunc} { assert( ret>0 ); } - if( bRemoveDiacritic ) ret = ${::remove_diacritic}(ret); + if( eRemoveDiacritic ){ + ret = ${::remove_diacritic}(ret, eRemoveDiacritic==2); + } } }] @@ -605,10 +618,6 @@ proc print_categories {lMap} { set nCat [expr [llength [array names C]] + 1] puts [code { - int sqlite3Fts5UnicodeNCat(void) { - return $nCat; - } - int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ aArray[0] = 1; switch( zCat[0] ){ @@ -691,7 +700,7 @@ proc print_categories {lMap} { static u16 aFts5UnicodeMap[] = {$aMapArray}; static u16 aFts5UnicodeData[] = {$aDataArray}; - int sqlite3Fts5UnicodeCategory(int iCode) { + int sqlite3Fts5UnicodeCategory(u32 iCode) { int iRes = -1; int iHi; int iLo; @@ -774,7 +783,7 @@ proc print_test_categories {lMap} { aArray[0] = 1; } - c = sqlite3Fts5UnicodeCategory(i); + c = sqlite3Fts5UnicodeCategory((u32)i); if( aArray[c]==0 ){ *piCode = i; return 1; @@ -829,7 +838,7 @@ proc print_fold_test {zFunc mappings} { proc print_fileheader {} { puts [string trim { /* -** 2012 May 25 +** 2012-05-25 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: diff --git a/ext/fts3/unicode/parseunicode.tcl b/ext/fts3/unicode/parseunicode.tcl index 966d7bd..7c246a4 100644 --- a/ext/fts3/unicode/parseunicode.tcl +++ b/ext/fts3/unicode/parseunicode.tcl @@ -7,12 +7,24 @@ # character that it should be replaced with, or an empty string if the # codepoint should simply be removed from the input. Examples: # -# { 224 a } (replace codepoint 224 to "a") -# { 769 "" } (remove codepoint 769 from input) +# { 224 a 0 } (replace codepoint 224 to "a") +# { 769 "" 0 } (remove codepoint 769 from input) # # Mappings are only returned for non-upper case codepoints. It is assumed # that the input has already been folded to lower case. # +# The third value in the list is always either 0 or 1. 0 if the +# UnicodeData.txt file maps the codepoint to a single ASCII character and +# a diacritic, or 1 if the mapping is indirect. For example, consider the +# two entries: +# +# 1ECD;LATIN SMALL LETTER O WITH DOT BELOW;Ll;0;L;006F 0323;;;;N;;;1ECC;;1ECC +# 1ED9;LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW;Ll;0;L;1ECD 0302;;;;N;;;1ED8;;1ED8 +# +# The first codepoint is a direct mapping (as 006F is ASCII and 0323 is a +# diacritic). The second is an indirect mapping, as it maps to the +# first codepoint plus 0302 (a diacritic). +# proc rd_load_unicodedata_text {zName} { global tl_lookup_table @@ -53,18 +65,29 @@ proc rd_load_unicodedata_text {zName} { set iAscii [expr "0x[lindex $character_decomposition_mapping 0]"] set iDia [expr "0x[lindex $character_decomposition_mapping 1]"] + # Filter out upper-case characters, as they will be mapped to their + # lower-case equivalents before this data is used. if {[info exists tl_lookup_table($iCode)]} continue + # Check if this is an indirect mapping. If so, set bIndirect to true + # and change $iAscii to the indirectly mappped ASCII character. + set bIndirect 0 + if {[info exists dia($iDia)] && [info exists mapping($iAscii)]} { + set iAscii $mapping($iAscii) + set bIndirect 1 + } + if { ($iAscii >= 97 && $iAscii <= 122) || ($iAscii >= 65 && $iAscii <= 90) } { - lappend lRet [list $iCode [string tolower [format %c $iAscii]]] + lappend lRet [list $iCode [string tolower [format %c $iAscii]] $bIndirect] + set mapping($iCode) $iAscii set dia($iDia) 1 } } foreach d [array names dia] { - lappend lRet [list $d ""] + lappend lRet [list $d "" 0] } set lRet [lsort -integer -index 0 $lRet] diff --git a/ext/fts5/fts5.h b/ext/fts5/fts5.h index 037da64..f0b7d55 100644 --- a/ext/fts5/fts5.h +++ b/ext/fts5/fts5.h @@ -120,12 +120,8 @@ struct Fts5PhraseIter { ** ** Usually, output parameter *piPhrase is set to the phrase number, *piCol ** to the column in which it occurs and *piOff the token offset of the -** first token of the phrase. The exception is if the table was created -** with the offsets=0 option specified. In this case *piOff is always -** set to -1. -** -** Returns SQLITE_OK if successful, or an error code (i.e. SQLITE_NOMEM) -** if an error occurs. +** first token of the phrase. Returns SQLITE_OK if successful, or an error +** code (i.e. SQLITE_NOMEM) if an error occurs. ** ** This API can be quite slow if used with an FTS5 table created with the ** "detail=none" or "detail=column" option. @@ -414,11 +410,11 @@ struct Fts5ExtensionApi { ** the tokenizer substitutes "first" for "1st" and the query works ** as expected. ** -**
  • By adding multiple synonyms for a single term to the FTS index. -** In this case, when tokenizing query text, the tokenizer may -** provide multiple synonyms for a single term within the document. -** FTS5 then queries the index for each synonym individually. For -** example, faced with the query: +**
  • By querying the index for all synonyms of each query term +** separately. In this case, when tokenizing query text, the +** tokenizer may provide multiple synonyms for a single term +** within the document. FTS5 then queries the index for each +** synonym individually. For example, faced with the query: ** ** ** ... MATCH 'first place' @@ -442,7 +438,7 @@ struct Fts5ExtensionApi { ** "place". ** ** This way, even if the tokenizer does not provide synonyms -** when tokenizing query text (it should not - to do would be +** when tokenizing query text (it should not - to do so would be ** inefficient), it doesn't matter if the user queries for ** 'first + place' or '1st + place', as there are entries in the ** FTS index corresponding to both forms of the first token. diff --git a/ext/fts5/fts5Int.h b/ext/fts5/fts5Int.h index a460a7a..e933762 100644 --- a/ext/fts5/fts5Int.h +++ b/ext/fts5/fts5Int.h @@ -87,6 +87,12 @@ extern int sqlite3_fts5_may_be_corrupt; # define assert_nc(x) assert(x) #endif +/* +** A version of memcmp() that does not cause asan errors if one of the pointer +** parameters is NULL and the number of bytes to compare is zero. +*/ +#define fts5Memcmp(s1, s2, n) ((n)==0 ? 0 : memcmp((s1), (s2), (n))) + /* Mark a function parameter as unused, to suppress nuisance compiler ** warnings. */ #ifndef UNUSED_PARAM @@ -274,7 +280,7 @@ void sqlite3Fts5Put32(u8*, int); int sqlite3Fts5Get32(const u8*); #define FTS5_POS2COLUMN(iPos) (int)(iPos >> 32) -#define FTS5_POS2OFFSET(iPos) (int)(iPos & 0xFFFFFFFF) +#define FTS5_POS2OFFSET(iPos) (int)(iPos & 0x7FFFFFFF) typedef struct Fts5PoslistReader Fts5PoslistReader; struct Fts5PoslistReader { @@ -309,7 +315,7 @@ int sqlite3Fts5PoslistNext64( ); /* Malloc utility */ -void *sqlite3Fts5MallocZero(int *pRc, int nByte); +void *sqlite3Fts5MallocZero(int *pRc, sqlite3_int64 nByte); char *sqlite3Fts5Strndup(int *pRc, const char *pIn, int nIn); /* Character set tests (like isspace(), isalpha() etc.) */ @@ -520,9 +526,19 @@ int sqlite3Fts5PutVarint(unsigned char *p, u64 v); /************************************************************************** -** Interface to code in fts5.c. +** Interface to code in fts5_main.c. */ +/* +** Virtual-table object. +*/ +typedef struct Fts5Table Fts5Table; +struct Fts5Table { + sqlite3_vtab base; /* Base class used by SQLite core */ + Fts5Config *pConfig; /* Virtual table configuration */ + Fts5Index *pIndex; /* Full-text index */ +}; + int sqlite3Fts5GetTokenizer( Fts5Global*, const char **azArg, @@ -532,7 +548,9 @@ int sqlite3Fts5GetTokenizer( char **pzErr ); -Fts5Index *sqlite3Fts5IndexFromCsrid(Fts5Global*, i64, Fts5Config **); +Fts5Table *sqlite3Fts5TableFromCsrid(Fts5Global*, i64); + +int sqlite3Fts5FlushToDisk(Fts5Table*); /* ** End of interface to code in fts5.c. @@ -788,7 +806,7 @@ int sqlite3Fts5UnicodeIsdiacritic(int c); int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic); int sqlite3Fts5UnicodeCatParse(const char*, u8*); -int sqlite3Fts5UnicodeCategory(int iCode); +int sqlite3Fts5UnicodeCategory(u32 iCode); void sqlite3Fts5UnicodeAscii(u8*, u8*); /* ** End of interface to code in fts5_unicode2.c. diff --git a/ext/fts5/fts5_aux.c b/ext/fts5/fts5_aux.c index 594b981..f7b9d0a 100644 --- a/ext/fts5/fts5_aux.c +++ b/ext/fts5/fts5_aux.c @@ -136,7 +136,7 @@ static void fts5HighlightAppend( HighlightContext *p, const char *z, int n ){ - if( *pRc==SQLITE_OK ){ + if( *pRc==SQLITE_OK && z ){ if( n<0 ) n = (int)strlen(z); p->zOut = sqlite3_mprintf("%z%.*s", p->zOut, n, z); if( p->zOut==0 ) *pRc = SQLITE_NOMEM; @@ -268,7 +268,7 @@ static int fts5SentenceFinderAdd(Fts5SFinder *p, int iAdd){ int nNew = p->nFirstAlloc ? p->nFirstAlloc*2 : 64; int *aNew; - aNew = (int*)sqlite3_realloc(p->aFirst, nNew*sizeof(int)); + aNew = (int*)sqlite3_realloc64(p->aFirst, nNew*sizeof(int)); if( aNew==0 ) return SQLITE_NOMEM; p->aFirst = aNew; p->nFirstAlloc = nNew; @@ -335,11 +335,12 @@ static int fts5SnippetScore( int nInst; int nScore = 0; int iLast = 0; + sqlite3_int64 iEnd = (sqlite3_int64)iPos + nToken; rc = pApi->xInstCount(pFts, &nInst); for(i=0; ixInst(pFts, i, &ip, &ic, &iOff); - if( rc==SQLITE_OK && ic==iCol && iOff>=iPos && iOff<(iPos+nToken) ){ + if( rc==SQLITE_OK && ic==iCol && iOff>=iPos && iOffnDocsize ) iAdj = nDocsize - nToken; if( iAdj<0 ) iAdj = 0; *piPos = iAdj; @@ -442,7 +443,9 @@ static void fts5SnippetFunction( int jj; rc = pApi->xInst(pFts, ii, &ip, &ic, &io); - if( ic!=i || rc!=SQLITE_OK ) continue; + if( ic!=i ) continue; + if( io>nDocsize ) rc = FTS5_CORRUPT; + if( rc!=SQLITE_OK ) continue; memset(aSeen, 0, nPhrase); rc = fts5SnippetScore(pApi, pFts, nDocsize, aSeen, i, io, nToken, &nScore, &iAdj @@ -568,13 +571,13 @@ static int fts5Bm25GetData( int nPhrase; /* Number of phrases in query */ sqlite3_int64 nRow = 0; /* Number of rows in table */ sqlite3_int64 nToken = 0; /* Number of tokens in table */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ int i; /* Allocate the Fts5Bm25Data object */ nPhrase = pApi->xPhraseCount(pFts); nByte = sizeof(Fts5Bm25Data) + nPhrase*2*sizeof(double); - p = (Fts5Bm25Data*)sqlite3_malloc(nByte); + p = (Fts5Bm25Data*)sqlite3_malloc64(nByte); if( p==0 ){ rc = SQLITE_NOMEM; }else{ @@ -586,6 +589,7 @@ static int fts5Bm25GetData( /* Calculate the average document length for this FTS5 table */ if( rc==SQLITE_OK ) rc = pApi->xRowCount(pFts, &nRow); + assert( rc!=SQLITE_OK || nRow>0 ); if( rc==SQLITE_OK ) rc = pApi->xColumnTotalSize(pFts, -1, &nToken); if( rc==SQLITE_OK ) p->avgdl = (double)nToken / (double)nRow; @@ -710,5 +714,3 @@ int sqlite3Fts5AuxInit(fts5_api *pApi){ return rc; } - - diff --git a/ext/fts5/fts5_buffer.c b/ext/fts5/fts5_buffer.c index b116897..61eb105 100644 --- a/ext/fts5/fts5_buffer.c +++ b/ext/fts5/fts5_buffer.c @@ -17,12 +17,12 @@ int sqlite3Fts5BufferSize(int *pRc, Fts5Buffer *pBuf, u32 nByte){ if( (u32)pBuf->nSpacenSpace ? pBuf->nSpace : 64; + u64 nNew = pBuf->nSpace ? pBuf->nSpace : 64; u8 *pNew; while( nNewp, nNew); + pNew = sqlite3_realloc64(pBuf->p, nNew); if( pNew==0 ){ *pRc = SQLITE_NOMEM; return 1; @@ -52,7 +52,7 @@ void sqlite3Fts5Put32(u8 *aBuf, int iVal){ } int sqlite3Fts5Get32(const u8 *aBuf){ - return (aBuf[0] << 24) + (aBuf[1] << 16) + (aBuf[2] << 8) + aBuf[3]; + return (int)((((u32)aBuf[0])<<24) + (aBuf[1]<<16) + (aBuf[2]<<8) + aBuf[3]); } /* @@ -183,7 +183,7 @@ int sqlite3Fts5PoslistNext64( iOff = ((i64)iVal) << 32; fts5FastGetVarint32(a, i, iVal); } - *piOff = iOff + (iVal-2); + *piOff = iOff + ((iVal-2) & 0x7FFFFFFF); *pi = i; return 0; } @@ -244,10 +244,10 @@ int sqlite3Fts5PoslistWriterAppend( return SQLITE_OK; } -void *sqlite3Fts5MallocZero(int *pRc, int nByte){ +void *sqlite3Fts5MallocZero(int *pRc, sqlite3_int64 nByte){ void *pRet = 0; if( *pRc==SQLITE_OK ){ - pRet = sqlite3_malloc(nByte); + pRet = sqlite3_malloc64(nByte); if( pRet==0 ){ if( nByte>0 ) *pRc = SQLITE_NOMEM; }else{ diff --git a/ext/fts5/fts5_config.c b/ext/fts5/fts5_config.c index 17fc43e..b422c95 100644 --- a/ext/fts5/fts5_config.c +++ b/ext/fts5/fts5_config.c @@ -295,7 +295,7 @@ static int fts5ConfigParseSpecial( if( sqlite3_strnicmp("tokenize", zCmd, nCmd)==0 ){ const char *p = (const char*)zArg; - int nArg = (int)strlen(zArg) + 1; + sqlite3_int64 nArg = strlen(zArg) + 1; char **azArg = sqlite3Fts5MallocZero(&rc, sizeof(char*) * nArg); char *pDel = sqlite3Fts5MallocZero(&rc, nArg * 2); char *pSpace = pDel; @@ -425,8 +425,8 @@ static const char *fts5ConfigGobbleWord( ){ const char *zRet = 0; - int nIn = (int)strlen(zIn); - char *zOut = sqlite3_malloc(nIn+1); + sqlite3_int64 nIn = strlen(zIn); + char *zOut = sqlite3_malloc64(nIn+1); assert( *pRc==SQLITE_OK ); *pbQuoted = 0; @@ -529,7 +529,7 @@ int sqlite3Fts5ConfigParse( int rc = SQLITE_OK; /* Return code */ Fts5Config *pRet; /* New object to return */ int i; - int nByte; + sqlite3_int64 nByte; *ppOut = pRet = (Fts5Config*)sqlite3_malloc(sizeof(Fts5Config)); if( pRet==0 ) return SQLITE_NOMEM; diff --git a/ext/fts5/fts5_expr.c b/ext/fts5/fts5_expr.c index a09fe7d..c5bfb08 100644 --- a/ext/fts5/fts5_expr.c +++ b/ext/fts5/fts5_expr.c @@ -211,7 +211,7 @@ static int fts5ExprGetToken( return tok; } -static void *fts5ParseAlloc(u64 t){ return sqlite3_malloc((int)t); } +static void *fts5ParseAlloc(u64 t){ return sqlite3_malloc64((sqlite3_int64)t);} static void fts5ParseFree(void *p){ sqlite3_free(p); } int sqlite3Fts5ExprNew( @@ -356,8 +356,8 @@ static int fts5ExprSynonymList( if( sqlite3Fts5IterEof(pIter)==0 && pIter->iRowid==iRowid ){ if( pIter->nData==0 ) continue; if( nIter==nAlloc ){ - int nByte = sizeof(Fts5PoslistReader) * nAlloc * 2; - Fts5PoslistReader *aNew = (Fts5PoslistReader*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * nAlloc * 2; + Fts5PoslistReader *aNew = (Fts5PoslistReader*)sqlite3_malloc64(nByte); if( aNew==0 ){ rc = SQLITE_NOMEM; goto synonym_poslist_out; @@ -437,8 +437,8 @@ static int fts5ExprPhraseIsMatch( /* If the aStatic[] array is not large enough, allocate a large array ** using sqlite3_malloc(). This approach could be improved upon. */ if( pPhrase->nTerm>ArraySize(aStatic) ){ - int nByte = sizeof(Fts5PoslistReader) * pPhrase->nTerm; - aIter = (Fts5PoslistReader*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * pPhrase->nTerm; + aIter = (Fts5PoslistReader*)sqlite3_malloc64(nByte); if( !aIter ) return SQLITE_NOMEM; } memset(aIter, 0, sizeof(Fts5PoslistReader) * pPhrase->nTerm); @@ -572,7 +572,7 @@ static int fts5ExprNearIsMatch(int *pRc, Fts5ExprNearset *pNear){ /* If the aStatic[] array is not large enough, allocate a large array ** using sqlite3_malloc(). This approach could be improved upon. */ if( pNear->nPhrase>ArraySize(aStatic) ){ - int nByte = sizeof(Fts5NearTrimmer) * pNear->nPhrase; + sqlite3_int64 nByte = sizeof(Fts5NearTrimmer) * pNear->nPhrase; a = (Fts5NearTrimmer*)sqlite3Fts5MallocZero(&rc, nByte); }else{ memset(aStatic, 0, sizeof(aStatic)); @@ -1481,8 +1481,9 @@ Fts5ExprNearset *sqlite3Fts5ParseNearset( return pNear; } if( pNear==0 ){ - int nByte = sizeof(Fts5ExprNearset) + SZALLOC * sizeof(Fts5ExprPhrase*); - pRet = sqlite3_malloc(nByte); + sqlite3_int64 nByte; + nByte = sizeof(Fts5ExprNearset) + SZALLOC * sizeof(Fts5ExprPhrase*); + pRet = sqlite3_malloc64(nByte); if( pRet==0 ){ pParse->rc = SQLITE_NOMEM; }else{ @@ -1490,9 +1491,10 @@ Fts5ExprNearset *sqlite3Fts5ParseNearset( } }else if( (pNear->nPhrase % SZALLOC)==0 ){ int nNew = pNear->nPhrase + SZALLOC; - int nByte = sizeof(Fts5ExprNearset) + nNew * sizeof(Fts5ExprPhrase*); + sqlite3_int64 nByte; - pRet = (Fts5ExprNearset*)sqlite3_realloc(pNear, nByte); + nByte = sizeof(Fts5ExprNearset) + nNew * sizeof(Fts5ExprPhrase*); + pRet = (Fts5ExprNearset*)sqlite3_realloc64(pNear, nByte); if( pRet==0 ){ pParse->rc = SQLITE_NOMEM; } @@ -1556,8 +1558,8 @@ static int fts5ParseTokenize( if( pPhrase && pPhrase->nTerm>0 && (tflags & FTS5_TOKEN_COLOCATED) ){ Fts5ExprTerm *pSyn; - int nByte = sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer) + nToken+1; - pSyn = (Fts5ExprTerm*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = sizeof(Fts5ExprTerm) + sizeof(Fts5Buffer) + nToken+1; + pSyn = (Fts5ExprTerm*)sqlite3_malloc64(nByte); if( pSyn==0 ){ rc = SQLITE_NOMEM; }else{ @@ -1573,7 +1575,7 @@ static int fts5ParseTokenize( Fts5ExprPhrase *pNew; int nNew = SZALLOC + (pPhrase ? pPhrase->nTerm : 0); - pNew = (Fts5ExprPhrase*)sqlite3_realloc(pPhrase, + pNew = (Fts5ExprPhrase*)sqlite3_realloc64(pPhrase, sizeof(Fts5ExprPhrase) + sizeof(Fts5ExprTerm) * nNew ); if( pNew==0 ){ @@ -1659,9 +1661,9 @@ Fts5ExprPhrase *sqlite3Fts5ParseTerm( if( pAppend==0 ){ if( (pParse->nPhrase % 8)==0 ){ - int nByte = sizeof(Fts5ExprPhrase*) * (pParse->nPhrase + 8); + sqlite3_int64 nByte = sizeof(Fts5ExprPhrase*) * (pParse->nPhrase + 8); Fts5ExprPhrase **apNew; - apNew = (Fts5ExprPhrase**)sqlite3_realloc(pParse->apPhrase, nByte); + apNew = (Fts5ExprPhrase**)sqlite3_realloc64(pParse->apPhrase, nByte); if( apNew==0 ){ pParse->rc = SQLITE_NOMEM; fts5ExprPhraseFree(sCtx.pPhrase); @@ -1716,8 +1718,10 @@ int sqlite3Fts5ExprClonePhrase( if( rc==SQLITE_OK ){ Fts5Colset *pColsetOrig = pOrig->pNode->pNear->pColset; if( pColsetOrig ){ - int nByte = sizeof(Fts5Colset) + (pColsetOrig->nCol-1) * sizeof(int); - Fts5Colset *pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte); + sqlite3_int64 nByte; + Fts5Colset *pColset; + nByte = sizeof(Fts5Colset) + (pColsetOrig->nCol-1) * sizeof(int); + pColset = (Fts5Colset*)sqlite3Fts5MallocZero(&rc, nByte); if( pColset ){ memcpy(pColset, pColsetOrig, nByte); } @@ -1837,7 +1841,7 @@ static Fts5Colset *fts5ParseColset( assert( pParse->rc==SQLITE_OK ); assert( iCol>=0 && iColpConfig->nCol ); - pNew = sqlite3_realloc(p, sizeof(Fts5Colset) + sizeof(int)*nCol); + pNew = sqlite3_realloc64(p, sizeof(Fts5Colset) + sizeof(int)*nCol); if( pNew==0 ){ pParse->rc = SQLITE_NOMEM; }else{ @@ -1933,7 +1937,7 @@ Fts5Colset *sqlite3Fts5ParseColset( static Fts5Colset *fts5CloneColset(int *pRc, Fts5Colset *pOrig){ Fts5Colset *pRet; if( pOrig ){ - int nByte = sizeof(Fts5Colset) + (pOrig->nCol-1) * sizeof(int); + sqlite3_int64 nByte = sizeof(Fts5Colset) + (pOrig->nCol-1) * sizeof(int); pRet = (Fts5Colset*)sqlite3Fts5MallocZero(pRc, nByte); if( pRet ){ memcpy(pRet, pOrig, nByte); @@ -2087,7 +2091,7 @@ Fts5ExprNode *sqlite3Fts5ParseNode( if( pParse->rc==SQLITE_OK ){ int nChild = 0; /* Number of children of returned node */ - int nByte; /* Bytes of space to allocate for this node */ + sqlite3_int64 nByte; /* Bytes of space to allocate for this node */ assert( (eType!=FTS5_STRING && !pNear) || (eType==FTS5_STRING && !pLeft && !pRight) @@ -2219,7 +2223,7 @@ Fts5ExprNode *sqlite3Fts5ParseImplicitAnd( } static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){ - int nByte = 0; + sqlite3_int64 nByte = 0; Fts5ExprTerm *p; char *zQuoted; @@ -2227,7 +2231,7 @@ static char *fts5ExprTermPrint(Fts5ExprTerm *pTerm){ for(p=pTerm; p; p=p->pSynonym){ nByte += (int)strlen(pTerm->zTerm) * 2 + 3 + 2; } - zQuoted = sqlite3_malloc(nByte); + zQuoted = sqlite3_malloc64(nByte); if( zQuoted ){ int i = 0; @@ -2467,7 +2471,7 @@ static void fts5ExprFunction( } nConfig = 3 + (nArg-iArg); - azConfig = (const char**)sqlite3_malloc(sizeof(char*) * nConfig); + azConfig = (const char**)sqlite3_malloc64(sizeof(char*) * nConfig); if( azConfig==0 ){ sqlite3_result_error_nomem(pCtx); return; @@ -2553,7 +2557,7 @@ static void fts5ExprIsAlnum( sqlite3Fts5UnicodeCatParse("N*", aArr); sqlite3Fts5UnicodeCatParse("Co", aArr); iCode = sqlite3_value_int(apVal[0]); - sqlite3_result_int(pCtx, aArr[sqlite3Fts5UnicodeCategory(iCode)]); + sqlite3_result_int(pCtx, aArr[sqlite3Fts5UnicodeCategory((u32)iCode)]); } static void fts5ExprFold( @@ -2648,7 +2652,7 @@ struct Fts5PoslistPopulator { Fts5PoslistPopulator *sqlite3Fts5ExprClearPoslists(Fts5Expr *pExpr, int bLive){ Fts5PoslistPopulator *pRet; - pRet = sqlite3_malloc(sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); + pRet = sqlite3_malloc64(sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); if( pRet ){ int i; memset(pRet, 0, sizeof(Fts5PoslistPopulator)*pExpr->nPhrase); @@ -2847,4 +2851,3 @@ int sqlite3Fts5ExprPhraseCollist( return rc; } - diff --git a/ext/fts5/fts5_hash.c b/ext/fts5/fts5_hash.c index 1757061..e0b91f0 100644 --- a/ext/fts5/fts5_hash.c +++ b/ext/fts5/fts5_hash.c @@ -90,14 +90,14 @@ int sqlite3Fts5HashNew(Fts5Config *pConfig, Fts5Hash **ppNew, int *pnByte){ if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ - int nByte; + sqlite3_int64 nByte; memset(pNew, 0, sizeof(Fts5Hash)); pNew->pnByte = pnByte; pNew->eDetail = pConfig->eDetail; pNew->nSlot = 1024; nByte = sizeof(Fts5HashEntry*) * pNew->nSlot; - pNew->aSlot = (Fts5HashEntry**)sqlite3_malloc(nByte); + pNew->aSlot = (Fts5HashEntry**)sqlite3_malloc64(nByte); if( pNew->aSlot==0 ){ sqlite3_free(pNew); *ppNew = 0; @@ -165,7 +165,7 @@ static int fts5HashResize(Fts5Hash *pHash){ Fts5HashEntry **apNew; Fts5HashEntry **apOld = pHash->aSlot; - apNew = (Fts5HashEntry**)sqlite3_malloc(nNew*sizeof(Fts5HashEntry*)); + apNew = (Fts5HashEntry**)sqlite3_malloc64(nNew*sizeof(Fts5HashEntry*)); if( !apNew ) return SQLITE_NOMEM; memset(apNew, 0, nNew*sizeof(Fts5HashEntry*)); @@ -259,7 +259,7 @@ int sqlite3Fts5HashWrite( if( p==0 ){ /* Figure out how much space to allocate */ char *zKey; - int nByte = sizeof(Fts5HashEntry) + (nToken+1) + 1 + 64; + sqlite3_int64 nByte = sizeof(Fts5HashEntry) + (nToken+1) + 1 + 64; if( nByte<128 ) nByte = 128; /* Grow the Fts5Hash.aSlot[] array if necessary. */ @@ -270,7 +270,7 @@ int sqlite3Fts5HashWrite( } /* Allocate new Fts5HashEntry and add it to the hash table. */ - p = (Fts5HashEntry*)sqlite3_malloc(nByte); + p = (Fts5HashEntry*)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, sizeof(Fts5HashEntry)); p->nAlloc = nByte; @@ -309,12 +309,12 @@ int sqlite3Fts5HashWrite( ** + 5 bytes for the new position offset (32-bit max). */ if( (p->nAlloc - p->nData) < (9 + 4 + 1 + 3 + 5) ){ - int nNew = p->nAlloc * 2; + sqlite3_int64 nNew = p->nAlloc * 2; Fts5HashEntry *pNew; Fts5HashEntry **pp; - pNew = (Fts5HashEntry*)sqlite3_realloc(p, nNew); + pNew = (Fts5HashEntry*)sqlite3_realloc64(p, nNew); if( pNew==0 ) return SQLITE_NOMEM; - pNew->nAlloc = nNew; + pNew->nAlloc = (int)nNew; for(pp=&pHash->aSlot[iHash]; *pp!=p; pp=&(*pp)->pHashNext); *pp = pNew; p = pNew; @@ -438,7 +438,7 @@ static int fts5HashEntrySort( int i; *ppSorted = 0; - ap = sqlite3_malloc(sizeof(Fts5HashEntry*) * nMergeSlot); + ap = sqlite3_malloc64(sizeof(Fts5HashEntry*) * nMergeSlot); if( !ap ) return SQLITE_NOMEM; memset(ap, 0, sizeof(Fts5HashEntry*) * nMergeSlot); @@ -483,7 +483,8 @@ int sqlite3Fts5HashQuery( for(p=pHash->aSlot[iHash]; p; p=p->pHashNext){ zKey = fts5EntryKey(p); - if( memcmp(zKey, pTerm, nTerm)==0 && zKey[nTerm]==0 ) break; + assert( p->nKey+1==(int)strlen(zKey) ); + if( nTerm==p->nKey+1 && memcmp(zKey, pTerm, nTerm)==0 ) break; } if( p ){ @@ -534,4 +535,3 @@ void sqlite3Fts5HashScanEntry( *pnDoclist = 0; } } - diff --git a/ext/fts5/fts5_index.c b/ext/fts5/fts5_index.c index 0a6d8d2..5ce75bd 100644 --- a/ext/fts5/fts5_index.c +++ b/ext/fts5/fts5_index.c @@ -512,7 +512,6 @@ struct Fts5Iter { Fts5IndexIter base; /* Base class containing output vars */ Fts5Index *pIndex; /* Index that owns this iterator */ - Fts5Structure *pStruct; /* Database structure for this iterator */ Fts5Buffer poslist; /* Buffer containing current poslist */ Fts5Colset *pColset; /* Restrict matches to these columns */ @@ -573,7 +572,7 @@ static u16 fts5GetU16(const u8 *aIn){ ** If an OOM error is encountered, return NULL and set the error code in ** the Fts5Index handle passed as the first argument. */ -static void *fts5IdxMalloc(Fts5Index *p, int nByte){ +static void *fts5IdxMalloc(Fts5Index *p, sqlite3_int64 nByte){ return sqlite3Fts5MallocZero(&p->rc, nByte); } @@ -607,7 +606,7 @@ static int fts5BufferCompareBlob( */ static int fts5BufferCompare(Fts5Buffer *pLeft, Fts5Buffer *pRight){ int nCmp = MIN(pLeft->n, pRight->n); - int res = memcmp(pLeft->p, pRight->p, nCmp); + int res = fts5Memcmp(pLeft->p, pRight->p, nCmp); return (res==0 ? (pLeft->n - pRight->n) : res); } @@ -673,8 +672,8 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ if( rc==SQLITE_OK ){ u8 *aOut = 0; /* Read blob data into this buffer */ int nByte = sqlite3_blob_bytes(p->pReader); - int nAlloc = sizeof(Fts5Data) + nByte + FTS5_DATA_PADDING; - pRet = (Fts5Data*)sqlite3_malloc(nAlloc); + sqlite3_int64 nAlloc = sizeof(Fts5Data) + nByte + FTS5_DATA_PADDING; + pRet = (Fts5Data*)sqlite3_malloc64(nAlloc); if( pRet ){ pRet->nn = nByte; aOut = pRet->p = (u8*)&pRet[1]; @@ -690,6 +689,7 @@ static Fts5Data *fts5DataRead(Fts5Index *p, i64 iRowid){ pRet = 0; }else{ /* TODO1: Fix this */ + pRet->p[nByte] = 0x00; pRet->szLeaf = fts5GetU16(&pRet->p[2]); } } @@ -729,7 +729,8 @@ static int fts5IndexPrepareStmt( if( p->rc==SQLITE_OK ){ if( zSql ){ p->rc = sqlite3_prepare_v3(p->pConfig->db, zSql, -1, - SQLITE_PREPARE_PERSISTENT, ppStmt, 0); + SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB, + ppStmt, 0); }else{ p->rc = SQLITE_NOMEM; } @@ -770,23 +771,12 @@ static void fts5DataDelete(Fts5Index *p, i64 iFirst, i64 iLast){ if( p->rc!=SQLITE_OK ) return; if( p->pDeleter==0 ){ - int rc; Fts5Config *pConfig = p->pConfig; char *zSql = sqlite3_mprintf( "DELETE FROM '%q'.'%q_data' WHERE id>=? AND id<=?", pConfig->zDb, pConfig->zName ); - if( zSql==0 ){ - rc = SQLITE_NOMEM; - }else{ - rc = sqlite3_prepare_v3(pConfig->db, zSql, -1, - SQLITE_PREPARE_PERSISTENT, &p->pDeleter, 0); - sqlite3_free(zSql); - } - if( rc!=SQLITE_OK ){ - p->rc = rc; - return; - } + if( fts5IndexPrepareStmt(p, &p->pDeleter, zSql) ) return; } sqlite3_bind_int64(p->pDeleter, 1, iFirst); @@ -858,7 +848,7 @@ static int fts5StructureDecode( int iLvl; int nLevel = 0; int nSegment = 0; - int nByte; /* Bytes of space to allocate at pRet */ + sqlite3_int64 nByte; /* Bytes of space to allocate at pRet */ Fts5Structure *pRet = 0; /* Structure object to return */ /* Grab the cookie value */ @@ -869,6 +859,11 @@ static int fts5StructureDecode( ** structure record. */ i += fts5GetVarint32(&pData[i], nLevel); i += fts5GetVarint32(&pData[i], nSegment); + if( nLevel>FTS5_MAX_SEGMENT || nLevel<0 + || nSegment>FTS5_MAX_SEGMENT || nSegment<0 + ){ + return FTS5_CORRUPT; + } nByte = ( sizeof(Fts5Structure) + /* Main structure */ sizeof(Fts5StructureLevel) * (nLevel-1) /* aLevel[] array */ @@ -891,25 +886,35 @@ static int fts5StructureDecode( }else{ i += fts5GetVarint32(&pData[i], pLvl->nMerge); i += fts5GetVarint32(&pData[i], nTotal); - assert( nTotal>=pLvl->nMerge ); + if( nTotalnMerge ) rc = FTS5_CORRUPT; pLvl->aSeg = (Fts5StructureSegment*)sqlite3Fts5MallocZero(&rc, nTotal * sizeof(Fts5StructureSegment) ); + nSegment -= nTotal; } if( rc==SQLITE_OK ){ pLvl->nSeg = nTotal; for(iSeg=0; iSegaSeg[iSeg]; if( i>=nData ){ rc = FTS5_CORRUPT; break; } - i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].iSegid); - i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].pgnoFirst); - i += fts5GetVarint32(&pData[i], pLvl->aSeg[iSeg].pgnoLast); + i += fts5GetVarint32(&pData[i], pSeg->iSegid); + i += fts5GetVarint32(&pData[i], pSeg->pgnoFirst); + i += fts5GetVarint32(&pData[i], pSeg->pgnoLast); + if( pSeg->pgnoLastpgnoFirst ){ + rc = FTS5_CORRUPT; + break; + } } + if( iLvl>0 && pLvl[-1].nMerge && nTotal==0 ) rc = FTS5_CORRUPT; + if( iLvl==nLevel-1 && pLvl->nMerge ) rc = FTS5_CORRUPT; } } + if( nSegment!=0 && rc==SQLITE_OK ) rc = FTS5_CORRUPT; + if( rc!=SQLITE_OK ){ fts5StructureRelease(pRet); pRet = 0; @@ -927,12 +932,12 @@ static void fts5StructureAddLevel(int *pRc, Fts5Structure **ppStruct){ if( *pRc==SQLITE_OK ){ Fts5Structure *pStruct = *ppStruct; int nLevel = pStruct->nLevel; - int nByte = ( + sqlite3_int64 nByte = ( sizeof(Fts5Structure) + /* Main structure */ sizeof(Fts5StructureLevel) * (nLevel+1) /* aLevel[] array */ ); - pStruct = sqlite3_realloc(pStruct, nByte); + pStruct = sqlite3_realloc64(pStruct, nByte); if( pStruct ){ memset(&pStruct->aLevel[nLevel], 0, sizeof(Fts5StructureLevel)); pStruct->nLevel++; @@ -957,10 +962,10 @@ static void fts5StructureExtendLevel( if( *pRc==SQLITE_OK ){ Fts5StructureLevel *pLvl = &pStruct->aLevel[iLvl]; Fts5StructureSegment *aNew; - int nByte; + sqlite3_int64 nByte; nByte = (pLvl->nSeg + nExtra) * sizeof(Fts5StructureSegment); - aNew = sqlite3_realloc(pLvl->aSeg, nByte); + aNew = sqlite3_realloc64(pLvl->aSeg, nByte); if( aNew ){ if( bInsert==0 ){ memset(&aNew[pLvl->nSeg], 0, sizeof(Fts5StructureSegment) * nExtra); @@ -1474,10 +1479,10 @@ static Fts5DlidxIter *fts5DlidxIterInit( int bDone = 0; for(i=0; p->rc==SQLITE_OK && bDone==0; i++){ - int nByte = sizeof(Fts5DlidxIter) + i * sizeof(Fts5DlidxLvl); + sqlite3_int64 nByte = sizeof(Fts5DlidxIter) + i * sizeof(Fts5DlidxLvl); Fts5DlidxIter *pNew; - pNew = (Fts5DlidxIter*)sqlite3_realloc(pIter, nByte); + pNew = (Fts5DlidxIter*)sqlite3_realloc64(pIter, nByte); if( pNew==0 ){ p->rc = SQLITE_NOMEM; }else{ @@ -1647,12 +1652,13 @@ static void fts5SegIterLoadTerm(Fts5Index *p, Fts5SegIter *pIter, int nKeep){ int nNew; /* Bytes of new data */ iOff += fts5GetVarint32(&a[iOff], nNew); - if( iOff+nNew>pIter->pLeaf->nn ){ + if( iOff+nNew>pIter->pLeaf->szLeaf || nKeep>pIter->term.n || nNew==0 ){ p->rc = FTS5_CORRUPT; return; } pIter->term.n = nKeep; fts5BufferAppendBlob(&p->rc, &pIter->term, nNew, &a[iOff]); + assert( pIter->term.n<=pIter->term.nSpace ); iOff += nNew; pIter->iTermLeafOffset = iOff; pIter->iTermLeafPgno = pIter->iLeafPgno; @@ -1717,7 +1723,7 @@ static void fts5SegIterInit( if( p->rc==SQLITE_OK ){ pIter->iLeafOffset = 4; assert_nc( pIter->pLeaf->nn>4 ); - assert( fts5LeafFirstTermOff(pIter->pLeaf)==4 ); + assert_nc( fts5LeafFirstTermOff(pIter->pLeaf)==4 ); pIter->iPgidxOff = pIter->pLeaf->szLeaf+1; fts5SegIterLoadTerm(p, pIter, 0); fts5SegIterLoadNPos(p, pIter); @@ -1773,7 +1779,7 @@ static void fts5SegIterReverseInitPage(Fts5Index *p, Fts5SegIter *pIter){ /* If necessary, grow the pIter->aRowidOffset[] array. */ if( iRowidOffset>=pIter->nRowidOffset ){ int nNew = pIter->nRowidOffset + 8; - int *aNew = (int*)sqlite3_realloc(pIter->aRowidOffset, nNew*sizeof(int)); + int *aNew = (int*)sqlite3_realloc64(pIter->aRowidOffset,nNew*sizeof(int)); if( aNew==0 ){ p->rc = SQLITE_NOMEM; break; @@ -2227,10 +2233,10 @@ static void fts5LeafSeek( int szLeaf = pIter->pLeaf->szLeaf; int n = pIter->pLeaf->nn; - int nMatch = 0; - int nKeep = 0; - int nNew = 0; - int iTermOff; + u32 nMatch = 0; + u32 nKeep = 0; + u32 nNew = 0; + u32 iTermOff; int iPgidx; /* Current offset in pgidx */ int bEndOfPage = 0; @@ -2254,15 +2260,15 @@ static void fts5LeafSeek( assert( nKeep>=nMatch ); if( nKeep==nMatch ){ - int nCmp; - int i; - nCmp = MIN(nNew, nTerm-nMatch); + u32 nCmp; + u32 i; + nCmp = (u32)MIN(nNew, nTerm-nMatch); for(i=0; ipLeaf->p[iPgidx], iOff); if( iOff<4 || iOff>=pIter->pLeaf->szLeaf ){ p->rc = FTS5_CORRUPT; + return; }else{ nKeep = 0; iTermOff = iOff; @@ -2318,8 +2325,11 @@ static void fts5LeafSeek( } search_success: - pIter->iLeafOffset = iOff + nNew; + if( pIter->iLeafOffset>n || nNew<1 ){ + p->rc = FTS5_CORRUPT; + return; + } pIter->iTermLeafOffset = pIter->iLeafOffset; pIter->iTermLeafPgno = pIter->iLeafPgno; @@ -2426,7 +2436,7 @@ static void fts5SegIterSeekInit( ** 4) the FTS5INDEX_QUERY_SCAN flag was set and the iterator points ** to an entry with a term greater than or equal to (pTerm/nTerm). */ - assert( p->rc!=SQLITE_OK /* 1 */ + assert_nc( p->rc!=SQLITE_OK /* 1 */ || pIter->pLeaf==0 /* 2 */ || fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)==0 /* 3 */ || (bGe && fts5BufferCompareBlob(&pIter->term, pTerm, nTerm)>0) /* 4 */ @@ -2524,7 +2534,7 @@ static void fts5AssertComparisonResult( assert( pRes->iFirst==i1 ); }else{ int nMin = MIN(p1->term.n, p2->term.n); - int res = memcmp(p1->term.p, p2->term.p, nMin); + int res = fts5Memcmp(p1->term.p, p2->term.p, nMin); if( res==0 ) res = p1->term.n - p2->term.n; if( res==0 ){ @@ -2747,7 +2757,6 @@ static void fts5MultiIterFree(Fts5Iter *pIter){ for(i=0; inSeg; i++){ fts5SegIterClear(&pIter->aSeg[i]); } - fts5StructureRelease(pIter->pStruct); fts5BufferFree(&pIter->poslist); sqlite3_free(pIter); } @@ -3095,7 +3104,8 @@ static void fts5SegiterPoslist( Fts5Colset *pColset, Fts5Buffer *pBuf ){ - if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos) ){ + if( 0==fts5BufferGrow(&p->rc, pBuf, pSeg->nPos+FTS5_DATA_ZERO_PADDING) ){ + memset(&pBuf->p[pBuf->n+pSeg->nPos], 0, FTS5_DATA_ZERO_PADDING); if( pColset==0 ){ fts5ChunkIterate(p, pSeg, (void*)pBuf, fts5PoslistCallback); }else{ @@ -3393,9 +3403,7 @@ static void fts5MultiIterNew( if( pNew==0 ) return; pNew->bRev = (0!=(flags & FTS5INDEX_QUERY_DESC)); pNew->bSkipEmpty = (0!=(flags & FTS5INDEX_QUERY_SKIPEMPTY)); - pNew->pStruct = pStruct; pNew->pColset = pColset; - fts5StructureRef(pStruct); if( (flags & FTS5INDEX_QUERY_NOOUTPUT)==0 ){ fts5IterSetOutputCb(&p->rc, pNew); } @@ -3573,24 +3581,24 @@ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){ for(iLvl=0; iLvlnLevel; iLvl++){ for(iSeg=0; iSegaLevel[iLvl].nSeg; iSeg++){ int iId = pStruct->aLevel[iLvl].aSeg[iSeg].iSegid; - if( iId<=FTS5_MAX_SEGMENT ){ - aUsed[(iId-1) / 32] |= 1 << ((iId-1) % 32); + if( iId<=FTS5_MAX_SEGMENT && iId>0 ){ + aUsed[(iId-1) / 32] |= (u32)1 << ((iId-1) % 32); } } } for(i=0; aUsed[i]==0xFFFFFFFF; i++); mask = aUsed[i]; - for(iSegid=0; mask & (1 << iSegid); iSegid++); + for(iSegid=0; mask & ((u32)1 << iSegid); iSegid++); iSegid += 1 + i*32; #ifdef SQLITE_DEBUG for(iLvl=0; iLvlnLevel; iLvl++){ for(iSeg=0; iSegaLevel[iLvl].nSeg; iSeg++){ - assert( iSegid!=pStruct->aLevel[iLvl].aSeg[iSeg].iSegid ); + assert_nc( iSegid!=pStruct->aLevel[iLvl].aSeg[iSeg].iSegid ); } } - assert( iSegid>0 && iSegid<=FTS5_MAX_SEGMENT ); + assert_nc( iSegid>0 && iSegid<=FTS5_MAX_SEGMENT ); { sqlite3_stmt *pIdxSelect = fts5IdxSelectStmt(p); @@ -3598,7 +3606,7 @@ static int fts5AllocateSegid(Fts5Index *p, Fts5Structure *pStruct){ u8 aBlob[2] = {0xff, 0xff}; sqlite3_bind_int(pIdxSelect, 1, iSegid); sqlite3_bind_blob(pIdxSelect, 2, aBlob, 2, SQLITE_STATIC); - assert( sqlite3_step(pIdxSelect)!=SQLITE_ROW ); + assert_nc( sqlite3_step(pIdxSelect)!=SQLITE_ROW ); p->rc = sqlite3_reset(pIdxSelect); sqlite3_bind_null(pIdxSelect, 2); } @@ -3668,7 +3676,7 @@ static int fts5WriteDlidxGrow( int nLvl ){ if( p->rc==SQLITE_OK && nLvl>=pWriter->nDlidx ){ - Fts5DlidxWriter *aDlidx = (Fts5DlidxWriter*)sqlite3_realloc( + Fts5DlidxWriter *aDlidx = (Fts5DlidxWriter*)sqlite3_realloc64( pWriter->aDlidx, sizeof(Fts5DlidxWriter) * nLvl ); if( aDlidx==0 ){ @@ -3747,8 +3755,10 @@ static void fts5WriteBtreeTerm( int nTerm, const u8 *pTerm /* First term on new page */ ){ fts5WriteFlushBtree(p, pWriter); - fts5BufferSet(&p->rc, &pWriter->btterm, nTerm, pTerm); - pWriter->iBtPage = pWriter->writer.pgno; + if( p->rc==SQLITE_OK ){ + fts5BufferSet(&p->rc, &pWriter->btterm, nTerm, pTerm); + pWriter->iBtPage = pWriter->writer.pgno; + } } /* @@ -3899,6 +3909,7 @@ static void fts5WriteAppendTerm( int nPrefix; /* Bytes of prefix compression for term */ Fts5PageWriter *pPage = &pWriter->writer; Fts5Buffer *pPgidx = &pWriter->writer.pgidx; + int nMin = MIN(pPage->term.n, nTerm); assert( p->rc==SQLITE_OK ); assert( pPage->buf.n>=4 ); @@ -3908,6 +3919,7 @@ static void fts5WriteAppendTerm( if( (pPage->buf.n + pPgidx->n + nTerm + 2)>=p->pConfig->pgsz ){ if( pPage->buf.n>4 ){ fts5WriteFlushLeaf(p, pWriter); + if( p->rc!=SQLITE_OK ) return; } fts5BufferGrow(&p->rc, &pPage->buf, nTerm+FTS5_DATA_PADDING); } @@ -3940,13 +3952,14 @@ static void fts5WriteAppendTerm( ** inefficient, but still correct. */ int n = nTerm; if( pPage->term.n ){ - n = 1 + fts5PrefixCompress(pPage->term.n, pPage->term.p, pTerm); + n = 1 + fts5PrefixCompress(nMin, pPage->term.p, pTerm); } fts5WriteBtreeTerm(p, pWriter, n, pTerm); + if( p->rc!=SQLITE_OK ) return; pPage = &pWriter->writer; } }else{ - nPrefix = fts5PrefixCompress(pPage->term.n, pPage->term.p, pTerm); + nPrefix = fts5PrefixCompress(nMin, pPage->term.p, pTerm); fts5BufferAppendVarint(&p->rc, &pPage->buf, nPrefix); } @@ -3993,7 +4006,7 @@ static void fts5WriteAppendRowid( if( pWriter->bFirstRowidInDoclist || pWriter->bFirstRowidInPage ){ fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid); }else{ - assert( p->rc || iRowid>pWriter->iPrevRowid ); + assert_nc( p->rc || iRowid>pWriter->iPrevRowid ); fts5BufferAppendVarint(&p->rc, &pPage->buf, iRowid - pWriter->iPrevRowid); } pWriter->iPrevRowid = iRowid; @@ -4115,7 +4128,7 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ int i; Fts5Buffer buf; memset(&buf, 0, sizeof(Fts5Buffer)); - for(i=0; inSeg; i++){ + for(i=0; inSeg && p->rc==SQLITE_OK; i++){ Fts5SegIter *pSeg = &pIter->aSeg[i]; if( pSeg->pSeg==0 ){ /* no-op */ @@ -4133,35 +4146,43 @@ static void fts5TrimSegments(Fts5Index *p, Fts5Iter *pIter){ u8 aHdr[4] = {0x00, 0x00, 0x00, 0x00}; iLeafRowid = FTS5_SEGMENT_ROWID(iId, pSeg->iTermLeafPgno); - pData = fts5DataRead(p, iLeafRowid); + pData = fts5LeafRead(p, iLeafRowid); if( pData ){ - fts5BufferZero(&buf); - fts5BufferGrow(&p->rc, &buf, pData->nn); - fts5BufferAppendBlob(&p->rc, &buf, sizeof(aHdr), aHdr); - fts5BufferAppendVarint(&p->rc, &buf, pSeg->term.n); - fts5BufferAppendBlob(&p->rc, &buf, pSeg->term.n, pSeg->term.p); - fts5BufferAppendBlob(&p->rc, &buf, pData->szLeaf-iOff, &pData->p[iOff]); - if( p->rc==SQLITE_OK ){ - /* Set the szLeaf field */ - fts5PutU16(&buf.p[2], (u16)buf.n); - } + if( iOff>pData->szLeaf ){ + /* This can occur if the pages that the segments occupy overlap - if + ** a single page has been assigned to more than one segment. In + ** this case a prior iteration of this loop may have corrupted the + ** segment currently being trimmed. */ + p->rc = FTS5_CORRUPT; + }else{ + fts5BufferZero(&buf); + fts5BufferGrow(&p->rc, &buf, pData->nn); + fts5BufferAppendBlob(&p->rc, &buf, sizeof(aHdr), aHdr); + fts5BufferAppendVarint(&p->rc, &buf, pSeg->term.n); + fts5BufferAppendBlob(&p->rc, &buf, pSeg->term.n, pSeg->term.p); + fts5BufferAppendBlob(&p->rc, &buf, pData->szLeaf-iOff,&pData->p[iOff]); + if( p->rc==SQLITE_OK ){ + /* Set the szLeaf field */ + fts5PutU16(&buf.p[2], (u16)buf.n); + } - /* Set up the new page-index array */ - fts5BufferAppendVarint(&p->rc, &buf, 4); - if( pSeg->iLeafPgno==pSeg->iTermLeafPgno - && pSeg->iEndofDoclistszLeaf - ){ - int nDiff = pData->szLeaf - pSeg->iEndofDoclist; - fts5BufferAppendVarint(&p->rc, &buf, buf.n - 1 - nDiff - 4); - fts5BufferAppendBlob(&p->rc, &buf, - pData->nn - pSeg->iPgidxOff, &pData->p[pSeg->iPgidxOff] - ); - } + /* Set up the new page-index array */ + fts5BufferAppendVarint(&p->rc, &buf, 4); + if( pSeg->iLeafPgno==pSeg->iTermLeafPgno + && pSeg->iEndofDoclistszLeaf + ){ + int nDiff = pData->szLeaf - pSeg->iEndofDoclist; + fts5BufferAppendVarint(&p->rc, &buf, buf.n - 1 - nDiff - 4); + fts5BufferAppendBlob(&p->rc, &buf, + pData->nn - pSeg->iPgidxOff, &pData->p[pSeg->iPgidxOff] + ); + } + pSeg->pSeg->pgnoFirst = pSeg->iTermLeafPgno; + fts5DataDelete(p, FTS5_SEGMENT_ROWID(iId, 1), iLeafRowid); + fts5DataWrite(p, iLeafRowid, buf.p, buf.n); + } fts5DataRelease(pData); - pSeg->pSeg->pgnoFirst = pSeg->iTermLeafPgno; - fts5DataDelete(p, FTS5_SEGMENT_ROWID(iId, 1), iLeafRowid); - fts5DataWrite(p, iLeafRowid, buf.p, buf.n); } } } @@ -4253,7 +4274,7 @@ static void fts5IndexMergeLevel( const u8 *pTerm; pTerm = fts5MultiIterTerm(pIter, &nTerm); - if( nTerm!=term.n || memcmp(pTerm, term.p, nTerm) ){ + if( nTerm!=term.n || fts5Memcmp(pTerm, term.p, nTerm) ){ if( pnRem && writer.nLeafWritten>nRem ){ break; } @@ -4508,6 +4529,7 @@ static void fts5FlushOneHash(Fts5Index *p){ /* Write the term for this entry to disk. */ sqlite3Fts5HashScanEntry(pHash, &zTerm, &pDoclist, &nDoclist); fts5WriteAppendTerm(p, &writer, (int)strlen(zTerm), (const u8*)zTerm); + if( p->rc!=SQLITE_OK ) break; assert( writer.bFirstRowidInPage==0 ); if( pgsz>=(pBuf->n + pPgidx->n + nDoclist + 1) ){ @@ -4530,6 +4552,7 @@ static void fts5FlushOneHash(Fts5Index *p){ pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iRowid); writer.bFirstRowidInPage = 0; fts5WriteDlidxAppend(p, &writer, iRowid); + if( p->rc!=SQLITE_OK ) break; }else{ pBuf->n += sqlite3Fts5PutVarint(&pBuf->p[pBuf->n], iDelta); } @@ -4587,7 +4610,7 @@ static void fts5FlushOneHash(Fts5Index *p){ /* TODO2: Doclist terminator written here. */ /* pBuf->p[pBuf->n++] = '\0'; */ assert( pBuf->n<=pBuf->nSpace ); - sqlite3Fts5HashScanNext(pHash); + if( p->rc==SQLITE_OK ) sqlite3Fts5HashScanNext(pHash); } sqlite3Fts5HashClear(pHash); fts5WriteFinish(p, &writer, &pgnoLast); @@ -4631,7 +4654,7 @@ static Fts5Structure *fts5IndexOptimizeStruct( Fts5Structure *pStruct ){ Fts5Structure *pNew = 0; - int nByte = sizeof(Fts5Structure); + sqlite3_int64 nByte = sizeof(Fts5Structure); int nSeg = pStruct->nSegment; int i; @@ -4761,11 +4784,13 @@ static void fts5AppendPoslist( Fts5Buffer *pBuf ){ int nData = pMulti->base.nData; + int nByte = nData + 9 + 9 + FTS5_DATA_ZERO_PADDING; assert( nData>0 ); - if( p->rc==SQLITE_OK && 0==fts5BufferGrow(&p->rc, pBuf, nData+9+9) ){ + if( p->rc==SQLITE_OK && 0==fts5BufferGrow(&p->rc, pBuf, nByte) ){ fts5BufferSafeAppendVarint(pBuf, iDelta); fts5BufferSafeAppendVarint(pBuf, nData*2); fts5BufferSafeAppendBlob(pBuf, pMulti->base.pData, nData); + memset(&pBuf->p[pBuf->n], 0, FTS5_DATA_ZERO_PADDING); } } @@ -4946,6 +4971,8 @@ static void fts5MergePrefixLists( int iOff2 = 0; u8 *a1 = &i1.aPoslist[i1.nSize]; u8 *a2 = &i2.aPoslist[i2.nSize]; + int nCopy; + u8 *aCopy; i64 iPrev = 0; Fts5PoslistWriter writer; @@ -4977,7 +5004,7 @@ static void fts5MergePrefixLists( sqlite3Fts5PoslistNext64(a1, i1.nPoslist, &iOff1, &iPos1); if( iPos1<0 ) break; }else{ - assert( iPos2!=iPrev ); + assert_nc( iPos2!=iPrev ); sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos2); sqlite3Fts5PoslistNext64(a2, i2.nPoslist, &iOff2, &iPos2); if( iPos2<0 ) break; @@ -4989,11 +5016,16 @@ static void fts5MergePrefixLists( if( iPos1!=iPrev ){ sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos1); } - fts5BufferSafeAppendBlob(&tmp, &a1[iOff1], i1.nPoslist-iOff1); + aCopy = &a1[iOff1]; + nCopy = i1.nPoslist - iOff1; }else{ assert( iPos2>=0 && iPos2!=iPrev ); sqlite3Fts5PoslistSafeAppend(&tmp, &iPrev, iPos2); - fts5BufferSafeAppendBlob(&tmp, &a2[iOff2], i2.nPoslist-iOff2); + aCopy = &a2[iOff2]; + nCopy = i2.nPoslist - iOff2; + } + if( nCopy>0 ){ + fts5BufferSafeAppendBlob(&tmp, aCopy, nCopy); } /* WRITEPOSLISTSIZE */ @@ -5001,6 +5033,7 @@ static void fts5MergePrefixLists( fts5BufferSafeAppendBlob(&out, tmp.p, tmp.n); fts5DoclistIterNext(&i1); fts5DoclistIterNext(&i2); + assert( out.n<=(p1->n+p2->n+9) ); if( i1.aPoslist==0 || i2.aPoslist==0 ) break; } } @@ -5102,7 +5135,7 @@ static void fts5SetupPrefixIter( } fts5MultiIterFree(p1); - pData = fts5IdxMalloc(p, sizeof(Fts5Data) + doclist.n); + pData = fts5IdxMalloc(p, sizeof(Fts5Data)+doclist.n+FTS5_DATA_ZERO_PADDING); if( pData ){ pData->p = (u8*)&pData[1]; pData->nn = pData->szLeaf = doclist.n; @@ -5864,11 +5897,11 @@ static void fts5IndexIntegrityCheckSegment( iOff = fts5LeafFirstTermOff(pLeaf); iRowidOff = fts5LeafFirstRowidOff(pLeaf); - if( iRowidOff>=iOff ){ + if( iRowidOff>=iOff || iOff>=pLeaf->szLeaf ){ p->rc = FTS5_CORRUPT; }else{ iOff += fts5GetVarint32(&pLeaf->p[iOff], nTerm); - res = memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm)); + res = fts5Memcmp(&pLeaf->p[iOff], zIdxTerm, MIN(nTerm, nIdxTerm)); if( res==0 ) res = nTerm - nIdxTerm; if( res<0 ) p->rc = FTS5_CORRUPT; } @@ -6263,7 +6296,7 @@ static void fts5DecodeFunction( u8 *a = 0; Fts5Buffer s; /* Build up text to return here */ int rc = SQLITE_OK; /* Return code */ - int nSpace = 0; + sqlite3_int64 nSpace = 0; int eDetailNone = (sqlite3_user_data(pCtx)!=0); assert( nArg==2 ); @@ -6279,8 +6312,7 @@ static void fts5DecodeFunction( nSpace = n + FTS5_DATA_ZERO_PADDING; a = (u8*)sqlite3Fts5MallocZero(&rc, nSpace); if( a==0 ) goto decode_out; - memcpy(a, aBlob, n); - + if( n>0 ) memcpy(a, aBlob, n); fts5DecodeRowid(iRowid, &iSegid, &bDlidx, &iHeight, &iPgno); @@ -6375,6 +6407,9 @@ static void fts5DecodeFunction( iPgidxOff = szLeaf = fts5GetU16(&a[2]); if( iPgidxOffn ){ + rc = FTS5_CORRUPT; + goto decode_out; } } @@ -6386,14 +6421,22 @@ static void fts5DecodeFunction( }else{ iOff = szLeaf; } + if( iOff>n ){ + rc = FTS5_CORRUPT; + goto decode_out; + } fts5DecodePoslist(&rc, &s, &a[4], iOff-4); /* Decode any more doclist data that appears on the page before the ** first term. */ nDoclist = (iTermOff ? iTermOff : szLeaf) - iOff; + if( nDoclist+iOff>n ){ + rc = FTS5_CORRUPT; + goto decode_out; + } fts5DecodeDoclist(&rc, &s, &a[iOff], nDoclist); - while( iPgidxOffszLeaf ){ + rc = FTS5_CORRUPT; + break; + } if( bFirst==0 ){ iOff += fts5GetVarint32(&a[iOff], nByte); + if( nByte>term.n ){ + rc = FTS5_CORRUPT; + break; + } term.n = nByte; } iOff += fts5GetVarint32(&a[iOff], nByte); + if( iOff+nByte>n ){ + rc = FTS5_CORRUPT; + break; + } fts5BufferAppendBlob(&rc, &term, nByte, &a[iOff]); iOff += nByte; diff --git a/ext/fts5/fts5_main.c b/ext/fts5/fts5_main.c index e5ff393..f20c01b 100644 --- a/ext/fts5/fts5_main.c +++ b/ext/fts5/fts5_main.c @@ -28,8 +28,8 @@ int sqlite3_fts5_may_be_corrupt = 1; typedef struct Fts5Auxdata Fts5Auxdata; typedef struct Fts5Auxiliary Fts5Auxiliary; typedef struct Fts5Cursor Fts5Cursor; +typedef struct Fts5FullTable Fts5FullTable; typedef struct Fts5Sorter Fts5Sorter; -typedef struct Fts5Table Fts5Table; typedef struct Fts5TokenizerModule Fts5TokenizerModule; /* @@ -110,13 +110,8 @@ struct Fts5TokenizerModule { Fts5TokenizerModule *pNext; /* Next registered tokenizer module */ }; -/* -** Virtual-table object. -*/ -struct Fts5Table { - sqlite3_vtab base; /* Base class used by SQLite core */ - Fts5Config *pConfig; /* Virtual table configuration */ - Fts5Index *pIndex; /* Full-text index */ +struct Fts5FullTable { + Fts5Table p; /* Public class members from fts5Int.h */ Fts5Storage *pStorage; /* Document store */ Fts5Global *pGlobal; /* Global (connection wide) data */ Fts5Cursor *pSortCsr; /* Sort data from this cursor */ @@ -254,7 +249,7 @@ struct Fts5Auxdata { #define FTS5_SAVEPOINT 5 #define FTS5_RELEASE 6 #define FTS5_ROLLBACKTO 7 -static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ +static void fts5CheckTransactionState(Fts5FullTable *p, int op, int iSavepoint){ switch( op ){ case FTS5_BEGIN: assert( p->ts.eState==0 ); @@ -293,7 +288,7 @@ static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ case FTS5_ROLLBACKTO: assert( p->ts.eState==1 ); - assert( iSavepoint>=0 ); + assert( iSavepoint>=-1 ); assert( iSavepoint<=p->ts.iSavepoint ); p->ts.iSavepoint = iSavepoint; break; @@ -306,18 +301,18 @@ static void fts5CheckTransactionState(Fts5Table *p, int op, int iSavepoint){ /* ** Return true if pTab is a contentless table. */ -static int fts5IsContentless(Fts5Table *pTab){ - return pTab->pConfig->eContent==FTS5_CONTENT_NONE; +static int fts5IsContentless(Fts5FullTable *pTab){ + return pTab->p.pConfig->eContent==FTS5_CONTENT_NONE; } /* ** Delete a virtual table handle allocated by fts5InitVtab(). */ -static void fts5FreeVtab(Fts5Table *pTab){ +static void fts5FreeVtab(Fts5FullTable *pTab){ if( pTab ){ - sqlite3Fts5IndexClose(pTab->pIndex); + sqlite3Fts5IndexClose(pTab->p.pIndex); sqlite3Fts5StorageClose(pTab->pStorage); - sqlite3Fts5ConfigFree(pTab->pConfig); + sqlite3Fts5ConfigFree(pTab->p.pConfig); sqlite3_free(pTab); } } @@ -326,7 +321,7 @@ static void fts5FreeVtab(Fts5Table *pTab){ ** The xDisconnect() virtual table method. */ static int fts5DisconnectMethod(sqlite3_vtab *pVtab){ - fts5FreeVtab((Fts5Table*)pVtab); + fts5FreeVtab((Fts5FullTable*)pVtab); return SQLITE_OK; } @@ -337,7 +332,7 @@ static int fts5DestroyMethod(sqlite3_vtab *pVtab){ Fts5Table *pTab = (Fts5Table*)pVtab; int rc = sqlite3Fts5DropAll(pTab->pConfig); if( rc==SQLITE_OK ){ - fts5FreeVtab((Fts5Table*)pVtab); + fts5FreeVtab((Fts5FullTable*)pVtab); } return rc; } @@ -366,28 +361,28 @@ static int fts5InitVtab( const char **azConfig = (const char**)argv; int rc = SQLITE_OK; /* Return code */ Fts5Config *pConfig = 0; /* Results of parsing argc/argv */ - Fts5Table *pTab = 0; /* New virtual table object */ + Fts5FullTable *pTab = 0; /* New virtual table object */ /* Allocate the new vtab object and parse the configuration */ - pTab = (Fts5Table*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5Table)); + pTab = (Fts5FullTable*)sqlite3Fts5MallocZero(&rc, sizeof(Fts5FullTable)); if( rc==SQLITE_OK ){ rc = sqlite3Fts5ConfigParse(pGlobal, db, argc, azConfig, &pConfig, pzErr); assert( (rc==SQLITE_OK && *pzErr==0) || pConfig==0 ); } if( rc==SQLITE_OK ){ - pTab->pConfig = pConfig; + pTab->p.pConfig = pConfig; pTab->pGlobal = pGlobal; } /* Open the index sub-system */ if( rc==SQLITE_OK ){ - rc = sqlite3Fts5IndexOpen(pConfig, bCreate, &pTab->pIndex, pzErr); + rc = sqlite3Fts5IndexOpen(pConfig, bCreate, &pTab->p.pIndex, pzErr); } /* Open the storage sub-system */ if( rc==SQLITE_OK ){ rc = sqlite3Fts5StorageOpen( - pConfig, pTab->pIndex, bCreate, &pTab->pStorage, pzErr + pConfig, pTab->p.pIndex, bCreate, &pTab->pStorage, pzErr ); } @@ -400,8 +395,8 @@ static int fts5InitVtab( if( rc==SQLITE_OK ){ assert( pConfig->pzErrmsg==0 ); pConfig->pzErrmsg = pzErr; - rc = sqlite3Fts5IndexLoadConfig(pTab->pIndex); - sqlite3Fts5IndexRollback(pTab->pIndex); + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); + sqlite3Fts5IndexRollback(pTab->p.pIndex); pConfig->pzErrmsg = 0; } @@ -614,7 +609,7 @@ static int fts5BestIndexMethod(sqlite3_vtab *pVTab, sqlite3_index_info *pInfo){ return SQLITE_OK; } -static int fts5NewTransaction(Fts5Table *pTab){ +static int fts5NewTransaction(Fts5FullTable *pTab){ Fts5Cursor *pCsr; for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ if( pCsr->base.pVtab==(sqlite3_vtab*)pTab ) return SQLITE_OK; @@ -626,16 +621,16 @@ static int fts5NewTransaction(Fts5Table *pTab){ ** Implementation of xOpen method. */ static int fts5OpenMethod(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCsr){ - Fts5Table *pTab = (Fts5Table*)pVTab; - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)pVTab; + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = 0; /* New cursor object */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ int rc; /* Return code */ rc = fts5NewTransaction(pTab); if( rc==SQLITE_OK ){ nByte = sizeof(Fts5Cursor) + pConfig->nCol * sizeof(int); - pCsr = (Fts5Cursor*)sqlite3_malloc(nByte); + pCsr = (Fts5Cursor*)sqlite3_malloc64(nByte); if( pCsr ){ Fts5Global *pGlobal = pTab->pGlobal; memset(pCsr, 0, nByte); @@ -673,7 +668,7 @@ static void fts5CsrNewrow(Fts5Cursor *pCsr){ } static void fts5FreeCursorComponents(Fts5Cursor *pCsr){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); Fts5Auxdata *pData; Fts5Auxdata *pNext; @@ -717,7 +712,7 @@ static void fts5FreeCursorComponents(Fts5Cursor *pCsr){ */ static int fts5CloseMethod(sqlite3_vtab_cursor *pCursor){ if( pCursor ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; Fts5Cursor **pp; @@ -774,7 +769,7 @@ static int fts5SorterNext(Fts5Cursor *pCsr){ ** Set the FTS5CSR_REQUIRE_RESEEK flag on all FTS5_PLAN_MATCH cursors ** open on table pTab. */ -static void fts5TripCursors(Fts5Table *pTab){ +static void fts5TripCursors(Fts5FullTable *pTab){ Fts5Cursor *pCsr; for(pCsr=pTab->pGlobal->pCsr; pCsr; pCsr=pCsr->pNext){ if( pCsr->ePlan==FTS5_PLAN_MATCH @@ -801,11 +796,11 @@ static int fts5CursorReseek(Fts5Cursor *pCsr, int *pbSkip){ int rc = SQLITE_OK; assert( *pbSkip==0 ); if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_RESEEK) ){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int bDesc = pCsr->bDesc; i64 iRowid = sqlite3Fts5ExprRowid(pCsr->pExpr); - rc = sqlite3Fts5ExprFirst(pCsr->pExpr, pTab->pIndex, iRowid, bDesc); + rc = sqlite3Fts5ExprFirst(pCsr->pExpr, pTab->p.pIndex, iRowid, bDesc); if( rc==SQLITE_OK && iRowid!=sqlite3Fts5ExprRowid(pCsr->pExpr) ){ *pbSkip = 1; } @@ -902,18 +897,22 @@ static int fts5PrepareStatement( return rc; } -static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ - Fts5Config *pConfig = pTab->pConfig; +static int fts5CursorFirstSorted( + Fts5FullTable *pTab, + Fts5Cursor *pCsr, + int bDesc +){ + Fts5Config *pConfig = pTab->p.pConfig; Fts5Sorter *pSorter; int nPhrase; - int nByte; + sqlite3_int64 nByte; int rc; const char *zRank = pCsr->zRank; const char *zRankArgs = pCsr->zRankArgs; nPhrase = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); nByte = sizeof(Fts5Sorter) + sizeof(int) * (nPhrase-1); - pSorter = (Fts5Sorter*)sqlite3_malloc(nByte); + pSorter = (Fts5Sorter*)sqlite3_malloc64(nByte); if( pSorter==0 ) return SQLITE_NOMEM; memset(pSorter, 0, nByte); pSorter->nIdx = nPhrase; @@ -950,10 +949,10 @@ static int fts5CursorFirstSorted(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ return rc; } -static int fts5CursorFirst(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ +static int fts5CursorFirst(Fts5FullTable *pTab, Fts5Cursor *pCsr, int bDesc){ int rc; Fts5Expr *pExpr = pCsr->pExpr; - rc = sqlite3Fts5ExprFirst(pExpr, pTab->pIndex, pCsr->iFirstRowid, bDesc); + rc = sqlite3Fts5ExprFirst(pExpr, pTab->p.pIndex, pCsr->iFirstRowid, bDesc); if( sqlite3Fts5ExprEof(pExpr) ){ CsrFlagSet(pCsr, FTS5CSR_EOF); } @@ -968,7 +967,7 @@ static int fts5CursorFirst(Fts5Table *pTab, Fts5Cursor *pCsr, int bDesc){ ** parameters. */ static int fts5SpecialMatch( - Fts5Table *pTab, + Fts5FullTable *pTab, Fts5Cursor *pCsr, const char *zQuery ){ @@ -979,18 +978,18 @@ static int fts5SpecialMatch( while( z[0]==' ' ) z++; for(n=0; z[n] && z[n]!=' '; n++); - assert( pTab->base.zErrMsg==0 ); + assert( pTab->p.base.zErrMsg==0 ); pCsr->ePlan = FTS5_PLAN_SPECIAL; if( 0==sqlite3_strnicmp("reads", z, n) ){ - pCsr->iSpecial = sqlite3Fts5IndexReads(pTab->pIndex); + pCsr->iSpecial = sqlite3Fts5IndexReads(pTab->p.pIndex); } else if( 0==sqlite3_strnicmp("id", z, n) ){ pCsr->iSpecial = pCsr->iCsrId; } else{ /* An unrecognized directive. Return an error message. */ - pTab->base.zErrMsg = sqlite3_mprintf("unknown special query: %.*s", n, z); + pTab->p.base.zErrMsg = sqlite3_mprintf("unknown special query: %.*s", n, z); rc = SQLITE_ERROR; } @@ -1002,7 +1001,7 @@ static int fts5SpecialMatch( ** pTab. If one is found, return a pointer to the corresponding Fts5Auxiliary ** structure. Otherwise, if no such function exists, return NULL. */ -static Fts5Auxiliary *fts5FindAuxiliary(Fts5Table *pTab, const char *zName){ +static Fts5Auxiliary *fts5FindAuxiliary(Fts5FullTable *pTab, const char *zName){ Fts5Auxiliary *pAux; for(pAux=pTab->pGlobal->pAux; pAux; pAux=pAux->pNext){ @@ -1015,8 +1014,8 @@ static Fts5Auxiliary *fts5FindAuxiliary(Fts5Table *pTab, const char *zName){ static int fts5FindRankFunction(Fts5Cursor *pCsr){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; Fts5Auxiliary *pAux = 0; const char *zRank = pCsr->zRank; @@ -1032,7 +1031,7 @@ static int fts5FindRankFunction(Fts5Cursor *pCsr){ assert( rc==SQLITE_OK || pCsr->pRankArgStmt==0 ); if( rc==SQLITE_OK ){ if( SQLITE_ROW==sqlite3_step(pStmt) ){ - int nByte; + sqlite3_int64 nByte; pCsr->nRankArg = sqlite3_column_count(pStmt); nByte = sizeof(sqlite3_value*)*pCsr->nRankArg; pCsr->apRankArg = (sqlite3_value**)sqlite3Fts5MallocZero(&rc, nByte); @@ -1054,8 +1053,8 @@ static int fts5FindRankFunction(Fts5Cursor *pCsr){ if( rc==SQLITE_OK ){ pAux = fts5FindAuxiliary(pTab, zRank); if( pAux==0 ){ - assert( pTab->base.zErrMsg==0 ); - pTab->base.zErrMsg = sqlite3_mprintf("no such function: %s", zRank); + assert( pTab->p.base.zErrMsg==0 ); + pTab->p.base.zErrMsg = sqlite3_mprintf("no such function: %s", zRank); rc = SQLITE_ERROR; } } @@ -1130,8 +1129,8 @@ static int fts5FilterMethod( int nVal, /* Number of elements in apVal */ sqlite3_value **apVal /* Arguments for the indexing scheme */ ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; int rc = SQLITE_OK; /* Error code */ int iVal = 0; /* Counter for apVal[] */ @@ -1160,8 +1159,8 @@ static int fts5FilterMethod( assert( pCsr->zRank==0 ); assert( pCsr->zRankArgs==0 ); - assert( pzErrmsg==0 || pzErrmsg==&pTab->base.zErrMsg ); - pConfig->pzErrmsg = &pTab->base.zErrMsg; + assert( pzErrmsg==0 || pzErrmsg==&pTab->p.base.zErrMsg ); + pConfig->pzErrmsg = &pTab->p.base.zErrMsg; /* Decode the arguments passed through to this function. ** @@ -1227,7 +1226,7 @@ static int fts5FilterMethod( ** but a request for an internal parameter. */ rc = fts5SpecialMatch(pTab, pCsr, &zExpr[1]); }else{ - char **pzErr = &pTab->base.zErrMsg; + char **pzErr = &pTab->p.base.zErrMsg; rc = sqlite3Fts5ExprNew(pConfig, iCol, zExpr, &pCsr->pExpr, pzErr); if( rc==SQLITE_OK ){ if( bOrderByRank ){ @@ -1250,7 +1249,7 @@ static int fts5FilterMethod( ** by rowid (ePlan==FTS5_PLAN_ROWID). */ pCsr->ePlan = (pRowidEq ? FTS5_PLAN_ROWID : FTS5_PLAN_SCAN); rc = sqlite3Fts5StorageStmt( - pTab->pStorage, fts5StmtType(pCsr), &pCsr->pStmt, &pTab->base.zErrMsg + pTab->pStorage, fts5StmtType(pCsr), &pCsr->pStmt, &pTab->p.base.zErrMsg ); if( rc==SQLITE_OK ){ if( pCsr->ePlan==FTS5_PLAN_ROWID ){ @@ -1333,12 +1332,12 @@ static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ /* If the cursor does not yet have a statement handle, obtain one now. */ if( pCsr->pStmt==0 ){ - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int eStmt = fts5StmtType(pCsr); rc = sqlite3Fts5StorageStmt( - pTab->pStorage, eStmt, &pCsr->pStmt, (bErrormsg?&pTab->base.zErrMsg:0) + pTab->pStorage, eStmt, &pCsr->pStmt, (bErrormsg?&pTab->p.base.zErrMsg:0) ); - assert( rc!=SQLITE_OK || pTab->base.zErrMsg==0 ); + assert( rc!=SQLITE_OK || pTab->p.base.zErrMsg==0 ); assert( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_CONTENT) ); } @@ -1360,11 +1359,11 @@ static int fts5SeekCursor(Fts5Cursor *pCsr, int bErrormsg){ return rc; } -static void fts5SetVtabError(Fts5Table *p, const char *zFormat, ...){ +static void fts5SetVtabError(Fts5FullTable *p, const char *zFormat, ...){ va_list ap; /* ... printf arguments */ va_start(ap, zFormat); - assert( p->base.zErrMsg==0 ); - p->base.zErrMsg = sqlite3_vmprintf(zFormat, ap); + assert( p->p.base.zErrMsg==0 ); + p->p.base.zErrMsg = sqlite3_vmprintf(zFormat, ap); va_end(ap); } @@ -1384,11 +1383,11 @@ static void fts5SetVtabError(Fts5Table *p, const char *zFormat, ...){ ** more commands are added to this function. */ static int fts5SpecialInsert( - Fts5Table *pTab, /* Fts5 table object */ + Fts5FullTable *pTab, /* Fts5 table object */ const char *zCmd, /* Text inserted into table-name column */ sqlite3_value *pVal /* Value inserted into rank column */ ){ - Fts5Config *pConfig = pTab->pConfig; + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; int bError = 0; @@ -1423,9 +1422,9 @@ static int fts5SpecialInsert( pConfig->bPrefixIndex = sqlite3_value_int(pVal); #endif }else{ - rc = sqlite3Fts5IndexLoadConfig(pTab->pIndex); + rc = sqlite3Fts5IndexLoadConfig(pTab->p.pIndex); if( rc==SQLITE_OK ){ - rc = sqlite3Fts5ConfigSetValue(pTab->pConfig, zCmd, pVal, &bError); + rc = sqlite3Fts5ConfigSetValue(pTab->p.pConfig, zCmd, pVal, &bError); } if( rc==SQLITE_OK ){ if( bError ){ @@ -1439,7 +1438,7 @@ static int fts5SpecialInsert( } static int fts5SpecialDelete( - Fts5Table *pTab, + Fts5FullTable *pTab, sqlite3_value **apVal ){ int rc = SQLITE_OK; @@ -1453,7 +1452,7 @@ static int fts5SpecialDelete( static void fts5StorageInsert( int *pRc, - Fts5Table *pTab, + Fts5FullTable *pTab, sqlite3_value **apVal, i64 *piRowid ){ @@ -1487,8 +1486,8 @@ static int fts5UpdateMethod( sqlite3_value **apVal, /* Array of arguments */ sqlite_int64 *pRowid /* OUT: The affected (or effected) rowid */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; + Fts5Config *pConfig = pTab->p.pConfig; int eType0; /* value_type() of apVal[0] */ int rc = SQLITE_OK; /* Return code */ @@ -1497,12 +1496,11 @@ static int fts5UpdateMethod( assert( pVtab->zErrMsg==0 ); assert( nArg==1 || nArg==(2+pConfig->nCol+2) ); - assert( nArg==1 - || sqlite3_value_type(apVal[1])==SQLITE_INTEGER - || sqlite3_value_type(apVal[1])==SQLITE_NULL + assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER + || sqlite3_value_type(apVal[0])==SQLITE_NULL ); - assert( pTab->pConfig->pzErrmsg==0 ); - pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; + assert( pTab->p.pConfig->pzErrmsg==0 ); + pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; /* Put any active cursors into REQUIRE_SEEK state. */ fts5TripCursors(pTab); @@ -1543,7 +1541,7 @@ static int fts5UpdateMethod( /* Filter out attempts to run UPDATE or DELETE on contentless tables. ** This is not suported. */ if( eType0==SQLITE_INTEGER && fts5IsContentless(pTab) ){ - pTab->base.zErrMsg = sqlite3_mprintf( + pTab->p.base.zErrMsg = sqlite3_mprintf( "cannot %s contentless fts5 table: %s", (nArg>1 ? "UPDATE" : "DELETE from"), pConfig->zName ); @@ -1556,46 +1554,52 @@ static int fts5UpdateMethod( rc = sqlite3Fts5StorageDelete(pTab->pStorage, iDel, 0); } - /* INSERT */ - else if( eType0!=SQLITE_INTEGER ){ - /* If this is a REPLACE, first remove the current entry (if any) */ - if( eConflict==SQLITE_REPLACE - && sqlite3_value_type(apVal[1])==SQLITE_INTEGER - ){ - i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); - } - fts5StorageInsert(&rc, pTab, apVal, pRowid); - } - - /* UPDATE */ + /* INSERT or UPDATE */ else{ - i64 iOld = sqlite3_value_int64(apVal[0]); /* Old rowid */ - i64 iNew = sqlite3_value_int64(apVal[1]); /* New rowid */ - if( iOld!=iNew ){ - if( eConflict==SQLITE_REPLACE ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); - } - fts5StorageInsert(&rc, pTab, apVal, pRowid); - }else{ - rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, pRowid); - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); - } - if( rc==SQLITE_OK ){ - rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal, *pRowid); - } + int eType1 = sqlite3_value_numeric_type(apVal[1]); + + if( eType1!=SQLITE_INTEGER && eType1!=SQLITE_NULL ){ + rc = SQLITE_MISMATCH; + } + + else if( eType0!=SQLITE_INTEGER ){ + /* If this is a REPLACE, first remove the current entry (if any) */ + if( eConflict==SQLITE_REPLACE && eType1==SQLITE_INTEGER ){ + i64 iNew = sqlite3_value_int64(apVal[1]); /* Rowid to delete */ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); } - }else{ - rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); fts5StorageInsert(&rc, pTab, apVal, pRowid); } + + /* UPDATE */ + else{ + i64 iOld = sqlite3_value_int64(apVal[0]); /* Old rowid */ + i64 iNew = sqlite3_value_int64(apVal[1]); /* New rowid */ + if( eType1==SQLITE_INTEGER && iOld!=iNew ){ + if( eConflict==SQLITE_REPLACE ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iNew, 0); + } + fts5StorageInsert(&rc, pTab, apVal, pRowid); + }else{ + rc = sqlite3Fts5StorageContentInsert(pTab->pStorage, apVal, pRowid); + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + } + if( rc==SQLITE_OK ){ + rc = sqlite3Fts5StorageIndexInsert(pTab->pStorage, apVal,*pRowid); + } + } + }else{ + rc = sqlite3Fts5StorageDelete(pTab->pStorage, iOld, 0); + fts5StorageInsert(&rc, pTab, apVal, pRowid); + } + } } } - pTab->pConfig->pzErrmsg = 0; + pTab->p.pConfig->pzErrmsg = 0; return rc; } @@ -1604,12 +1608,12 @@ static int fts5UpdateMethod( */ static int fts5SyncMethod(sqlite3_vtab *pVtab){ int rc; - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; fts5CheckTransactionState(pTab, FTS5_SYNC, 0); - pTab->pConfig->pzErrmsg = &pTab->base.zErrMsg; + pTab->p.pConfig->pzErrmsg = &pTab->p.base.zErrMsg; fts5TripCursors(pTab); rc = sqlite3Fts5StorageSync(pTab->pStorage); - pTab->pConfig->pzErrmsg = 0; + pTab->p.pConfig->pzErrmsg = 0; return rc; } @@ -1617,8 +1621,8 @@ static int fts5SyncMethod(sqlite3_vtab *pVtab){ ** Implementation of xBegin() method. */ static int fts5BeginMethod(sqlite3_vtab *pVtab){ - fts5CheckTransactionState((Fts5Table*)pVtab, FTS5_BEGIN, 0); - fts5NewTransaction((Fts5Table*)pVtab); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_BEGIN, 0); + fts5NewTransaction((Fts5FullTable*)pVtab); return SQLITE_OK; } @@ -1629,7 +1633,7 @@ static int fts5BeginMethod(sqlite3_vtab *pVtab){ */ static int fts5CommitMethod(sqlite3_vtab *pVtab){ UNUSED_PARAM(pVtab); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState((Fts5Table*)pVtab, FTS5_COMMIT, 0); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_COMMIT, 0); return SQLITE_OK; } @@ -1639,7 +1643,7 @@ static int fts5CommitMethod(sqlite3_vtab *pVtab){ */ static int fts5RollbackMethod(sqlite3_vtab *pVtab){ int rc; - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; fts5CheckTransactionState(pTab, FTS5_ROLLBACK, 0); rc = sqlite3Fts5StorageRollback(pTab->pStorage); return rc; @@ -1663,13 +1667,13 @@ static int fts5ApiColumnTotalSize( sqlite3_int64 *pnToken ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); return sqlite3Fts5StorageSize(pTab->pStorage, iCol, pnToken); } static int fts5ApiRowCount(Fts5Context *pCtx, i64 *pnRow){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); return sqlite3Fts5StorageRowCount(pTab->pStorage, pnRow); } @@ -1704,7 +1708,9 @@ static int fts5ApiColumnText( ){ int rc = SQLITE_OK; Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - if( fts5IsContentless((Fts5Table*)(pCsr->base.pVtab)) ){ + if( fts5IsContentless((Fts5FullTable*)(pCsr->base.pVtab)) + || pCsr->ePlan==FTS5_PLAN_SPECIAL + ){ *pz = 0; *pn = 0; }else{ @@ -1773,10 +1779,11 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ int rc = SQLITE_OK; Fts5PoslistReader *aIter; /* One iterator for each phrase */ int nIter; /* Number of iterators/phrases */ + int nCol = ((Fts5Table*)pCsr->base.pVtab)->pConfig->nCol; nIter = sqlite3Fts5ExprPhraseCount(pCsr->pExpr); if( pCsr->aInstIter==0 ){ - int nByte = sizeof(Fts5PoslistReader) * nIter; + sqlite3_int64 nByte = sizeof(Fts5PoslistReader) * nIter; pCsr->aInstIter = (Fts5PoslistReader*)sqlite3Fts5MallocZero(&rc, nByte); } aIter = pCsr->aInstIter; @@ -1811,7 +1818,7 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ nInst++; if( nInst>=pCsr->nInstAlloc ){ pCsr->nInstAlloc = pCsr->nInstAlloc ? pCsr->nInstAlloc*2 : 32; - aInst = (int*)sqlite3_realloc( + aInst = (int*)sqlite3_realloc64( pCsr->aInst, pCsr->nInstAlloc*sizeof(int)*3 ); if( aInst ){ @@ -1826,6 +1833,10 @@ static int fts5CacheInstArray(Fts5Cursor *pCsr){ aInst[0] = iBest; aInst[1] = FTS5_POS2COLUMN(aIter[iBest].iPos); aInst[2] = FTS5_POS2OFFSET(aIter[iBest].iPos); + if( aInst[1]<0 || aInst[1]>=nCol ){ + rc = FTS5_CORRUPT; + break; + } sqlite3Fts5PoslistReaderNext(&aIter[iBest]); } } @@ -1898,8 +1909,8 @@ static int fts5ColumnSizeCb( static int fts5ApiColumnSize(Fts5Context *pCtx, int iCol, int *pnToken){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); + Fts5Config *pConfig = pTab->p.pConfig; int rc = SQLITE_OK; if( CsrFlagTest(pCsr, FTS5CSR_REQUIRE_DOCSIZE) ){ @@ -2155,7 +2166,7 @@ static int fts5ApiQueryPhrase( int(*xCallback)(const Fts5ExtensionApi*, Fts5Context*, void*) ){ Fts5Cursor *pCsr = (Fts5Cursor*)pCtx; - Fts5Table *pTab = (Fts5Table*)(pCsr->base.pVtab); + Fts5FullTable *pTab = (Fts5FullTable*)(pCsr->base.pVtab); int rc; Fts5Cursor *pNew = 0; @@ -2232,25 +2243,19 @@ static void fts5ApiCallback( /* -** Given cursor id iId, return a pointer to the corresponding Fts5Index +** Given cursor id iId, return a pointer to the corresponding Fts5Table ** object. Or NULL If the cursor id does not exist. -** -** If successful, set *ppConfig to point to the associated config object -** before returning. */ -Fts5Index *sqlite3Fts5IndexFromCsrid( +Fts5Table *sqlite3Fts5TableFromCsrid( Fts5Global *pGlobal, /* FTS5 global context for db handle */ - i64 iCsrId, /* Id of cursor to find */ - Fts5Config **ppConfig /* OUT: Configuration object */ + i64 iCsrId /* Id of cursor to find */ ){ Fts5Cursor *pCsr; - Fts5Table *pTab; - pCsr = fts5CursorFromCsrid(pGlobal, iCsrId); - pTab = (Fts5Table*)pCsr->base.pVtab; - *ppConfig = pTab->pConfig; - - return pTab->pIndex; + if( pCsr ){ + return (Fts5Table*)pCsr->base.pVtab; + } + return 0; } /* @@ -2330,8 +2335,8 @@ static int fts5ColumnMethod( sqlite3_context *pCtx, /* Context for sqlite3_result_xxx() calls */ int iCol /* Index of column to read value from */ ){ - Fts5Table *pTab = (Fts5Table*)(pCursor->pVtab); - Fts5Config *pConfig = pTab->pConfig; + Fts5FullTable *pTab = (Fts5FullTable*)(pCursor->pVtab); + Fts5Config *pConfig = pTab->p.pConfig; Fts5Cursor *pCsr = (Fts5Cursor*)pCursor; int rc = SQLITE_OK; @@ -2383,7 +2388,7 @@ static int fts5FindFunctionMethod( void (**pxFunc)(sqlite3_context*,int,sqlite3_value**), /* OUT: Result */ void **ppArg /* OUT: User data for *pxFunc */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; Fts5Auxiliary *pAux; UNUSED_PARAM(nUnused); @@ -2405,21 +2410,24 @@ static int fts5RenameMethod( sqlite3_vtab *pVtab, /* Virtual table handle */ const char *zName /* New name of table */ ){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; return sqlite3Fts5StorageRename(pTab->pStorage, zName); } +int sqlite3Fts5FlushToDisk(Fts5Table *pTab){ + fts5TripCursors((Fts5FullTable*)pTab); + return sqlite3Fts5StorageSync(((Fts5FullTable*)pTab)->pStorage); +} + /* ** The xSavepoint() method. ** ** Flush the contents of the pending-terms table to disk. */ static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState(pTab, FTS5_SAVEPOINT, iSavepoint); - fts5TripCursors(pTab); - return sqlite3Fts5StorageSync(pTab->pStorage); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_SAVEPOINT, iSavepoint); + return sqlite3Fts5FlushToDisk((Fts5Table*)pVtab); } /* @@ -2428,11 +2436,9 @@ static int fts5SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** This is a no-op. */ static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ - fts5CheckTransactionState(pTab, FTS5_RELEASE, iSavepoint); - fts5TripCursors(pTab); - return sqlite3Fts5StorageSync(pTab->pStorage); + fts5CheckTransactionState((Fts5FullTable*)pVtab, FTS5_RELEASE, iSavepoint); + return sqlite3Fts5FlushToDisk((Fts5Table*)pVtab); } /* @@ -2441,7 +2447,7 @@ static int fts5ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){ ** Discard the contents of the pending terms table. */ static int fts5RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){ - Fts5Table *pTab = (Fts5Table*)pVtab; + Fts5FullTable *pTab = (Fts5FullTable*)pVtab; UNUSED_PARAM(iSavepoint); /* Call below is a no-op for NDEBUG builds */ fts5CheckTransactionState(pTab, FTS5_ROLLBACKTO, iSavepoint); fts5TripCursors(pTab); diff --git a/ext/fts5/fts5_storage.c b/ext/fts5/fts5_storage.c index 70d7135..c6dda28 100644 --- a/ext/fts5/fts5_storage.c +++ b/ext/fts5/fts5_storage.c @@ -115,7 +115,7 @@ static int fts5StorageGetStmt( char *zBind; int i; - zBind = sqlite3_malloc(1 + nCol*2); + zBind = sqlite3_malloc64(1 + nCol*2); if( zBind ){ for(i=0; idb, zSql, -1, - SQLITE_PREPARE_PERSISTENT, &p->aStmt[eStmt], 0); + int f = SQLITE_PREPARE_PERSISTENT; + if( eStmt>FTS5_STMT_LOOKUP ) f |= SQLITE_PREPARE_NO_VTAB; + rc = sqlite3_prepare_v3(pC->db, zSql, -1, f, &p->aStmt[eStmt], 0); sqlite3_free(zSql); if( rc!=SQLITE_OK && pzErrMsg ){ *pzErrMsg = sqlite3_mprintf("%s", sqlite3_errmsg(pC->db)); @@ -281,11 +282,11 @@ int sqlite3Fts5StorageOpen( ){ int rc = SQLITE_OK; Fts5Storage *p; /* New object */ - int nByte; /* Bytes of space to allocate */ + sqlite3_int64 nByte; /* Bytes of space to allocate */ nByte = sizeof(Fts5Storage) /* Fts5Storage object */ + pConfig->nCol * sizeof(i64); /* Fts5Storage.aTotalSize[] */ - *pp = p = (Fts5Storage*)sqlite3_malloc(nByte); + *pp = p = (Fts5Storage*)sqlite3_malloc64(nByte); if( !p ) return SQLITE_NOMEM; memset(p, 0, nByte); @@ -296,7 +297,7 @@ int sqlite3Fts5StorageOpen( if( bCreate ){ if( pConfig->eContent==FTS5_CONTENT_NORMAL ){ int nDefn = 32 + pConfig->nCol*10; - char *zDefn = sqlite3_malloc(32 + pConfig->nCol * 10); + char *zDefn = sqlite3_malloc64(32 + (sqlite3_int64)pConfig->nCol * 10); if( zDefn==0 ){ rc = SQLITE_NOMEM; }else{ @@ -587,7 +588,7 @@ int sqlite3Fts5StorageRebuild(Fts5Storage *p){ Fts5Config *pConfig = p->pConfig; sqlite3_stmt *pScan = 0; Fts5InsertCtx ctx; - int rc; + int rc, rc2; memset(&ctx, 0, sizeof(Fts5InsertCtx)); ctx.pStorage = p; @@ -626,6 +627,8 @@ int sqlite3Fts5StorageRebuild(Fts5Storage *p){ } } sqlite3_free(buf.p); + rc2 = sqlite3_reset(pScan); + if( rc==SQLITE_OK ) rc = rc2; /* Write the averages record */ if( rc==SQLITE_OK ){ @@ -875,7 +878,7 @@ int sqlite3Fts5StorageIntegrity(Fts5Storage *p){ memset(&ctx, 0, sizeof(Fts5IntegrityCtx)); ctx.pConfig = p->pConfig; - aTotalSize = (i64*)sqlite3_malloc(pConfig->nCol * (sizeof(int)+sizeof(i64))); + aTotalSize = (i64*)sqlite3_malloc64(pConfig->nCol*(sizeof(int)+sizeof(i64))); if( !aTotalSize ) return SQLITE_NOMEM; aColSize = (int*)&aTotalSize[pConfig->nCol]; memset(aTotalSize, 0, sizeof(i64) * pConfig->nCol); @@ -1075,7 +1078,13 @@ int sqlite3Fts5StorageSize(Fts5Storage *p, int iCol, i64 *pnToken){ int sqlite3Fts5StorageRowCount(Fts5Storage *p, i64 *pnRow){ int rc = fts5StorageLoadTotals(p, 0); if( rc==SQLITE_OK ){ + /* nTotalRow being zero does not necessarily indicate a corrupt + ** database - it might be that the FTS5 table really does contain zero + ** rows. However this function is only called from the xRowCount() API, + ** and there is no way for that API to be invoked if the table contains + ** no rows. Hence the FTS5_CORRUPT return. */ *pnRow = p->nTotalRow; + if( p->nTotalRow<=0 ) rc = FTS5_CORRUPT; } return rc; } diff --git a/ext/fts5/fts5_test_mi.c b/ext/fts5/fts5_test_mi.c index 481d09b..6f2d6e7 100644 --- a/ext/fts5/fts5_test_mi.c +++ b/ext/fts5/fts5_test_mi.c @@ -309,7 +309,7 @@ static Fts5MatchinfoCtx *fts5MatchinfoNew( int nPhrase; int i; int nInt; - int nByte; + sqlite3_int64 nByte; int rc; nCol = pApi->xColumnCount(pFts); @@ -330,7 +330,7 @@ static Fts5MatchinfoCtx *fts5MatchinfoNew( nByte = sizeof(Fts5MatchinfoCtx) /* The struct itself */ + sizeof(u32) * nInt /* The p->aRet[] array */ + (i+1); /* The p->zArg string */ - p = (Fts5MatchinfoCtx*)sqlite3_malloc(nByte); + p = (Fts5MatchinfoCtx*)sqlite3_malloc64(nByte); if( p==0 ){ sqlite3_result_error_nomem(pCtx); return 0; diff --git a/ext/fts5/fts5_test_tok.c b/ext/fts5/fts5_test_tok.c index 6f71e65..b5d4162 100644 --- a/ext/fts5/fts5_test_tok.c +++ b/ext/fts5/fts5_test_tok.c @@ -137,7 +137,7 @@ static int fts5tokDequoteArray( nByte += (int)(strlen(argv[i]) + 1); } - *pazDequote = azDequote = sqlite3_malloc(sizeof(char *)*argc + nByte); + *pazDequote = azDequote = sqlite3_malloc64(sizeof(char *)*argc + nByte); if( azDequote==0 ){ rc = SQLITE_NOMEM; }else{ @@ -335,7 +335,7 @@ static int fts5tokCb( if( (pCsr->nRow & (pCsr->nRow-1))==0 ){ int nNew = pCsr->nRow ? pCsr->nRow*2 : 32; Fts5tokRow *aNew; - aNew = (Fts5tokRow*)sqlite3_realloc(pCsr->aRow, nNew*sizeof(Fts5tokRow)); + aNew = (Fts5tokRow*)sqlite3_realloc64(pCsr->aRow, nNew*sizeof(Fts5tokRow)); if( aNew==0 ) return SQLITE_NOMEM; memset(&aNew[pCsr->nRow], 0, sizeof(Fts5tokRow)*(nNew-pCsr->nRow)); pCsr->aRow = aNew; @@ -378,7 +378,7 @@ static int fts5tokFilterMethod( if( pCsr->zInput==0 ){ rc = SQLITE_NOMEM; }else{ - memcpy(pCsr->zInput, zByte, nByte); + if( nByte>0 ) memcpy(pCsr->zInput, zByte, nByte); pCsr->zInput[nByte] = 0; rc = pTab->tok.xTokenize( pTab->pTok, (void*)pCsr, 0, zByte, nByte, fts5tokCb diff --git a/ext/fts5/fts5_tokenize.c b/ext/fts5/fts5_tokenize.c index af2bc22..9fced72 100644 --- a/ext/fts5/fts5_tokenize.c +++ b/ext/fts5/fts5_tokenize.c @@ -152,7 +152,7 @@ static int fts5AsciiTokenize( nByte = ie-is; if( nByte>nFold ){ if( pFold!=aFold ) sqlite3_free(pFold); - pFold = sqlite3_malloc(nByte*2); + pFold = sqlite3_malloc64((sqlite3_int64)nByte*2); if( pFold==0 ){ rc = SQLITE_NOMEM; break; @@ -234,13 +234,18 @@ struct Unicode61Tokenizer { unsigned char aTokenChar[128]; /* ASCII range token characters */ char *aFold; /* Buffer to fold text into */ int nFold; /* Size of aFold[] in bytes */ - int bRemoveDiacritic; /* True if remove_diacritics=1 is set */ + int eRemoveDiacritic; /* True if remove_diacritics=1 is set */ int nException; int *aiException; unsigned char aCategory[32]; /* True for token char categories */ }; +/* Values for eRemoveDiacritic (must match internals of fts5_unicode2.c) */ +#define FTS5_REMOVE_DIACRITICS_NONE 0 +#define FTS5_REMOVE_DIACRITICS_SIMPLE 1 +#define FTS5_REMOVE_DIACRITICS_COMPLEX 2 + static int fts5UnicodeAddExceptions( Unicode61Tokenizer *p, /* Tokenizer object */ const char *z, /* Characters to treat as exceptions */ @@ -251,13 +256,14 @@ static int fts5UnicodeAddExceptions( int *aNew; if( n>0 ){ - aNew = (int*)sqlite3_realloc(p->aiException, (n+p->nException)*sizeof(int)); + aNew = (int*)sqlite3_realloc64(p->aiException, + (n+p->nException)*sizeof(int)); if( aNew ){ int nNew = p->nException; const unsigned char *zCsr = (const unsigned char*)z; const unsigned char *zTerm = (const unsigned char*)&z[n]; while( zCsriCode ) break; + if( (u32)aNew[i]>iCode ) break; } memmove(&aNew[i+1], &aNew[i], (nNew-i)*sizeof(int)); aNew[i] = iCode; @@ -361,7 +367,7 @@ static int fts5UnicodeCreate( int i; memset(p, 0, sizeof(Unicode61Tokenizer)); - p->bRemoveDiacritic = 1; + p->eRemoveDiacritic = FTS5_REMOVE_DIACRITICS_SIMPLE; p->nFold = 64; p->aFold = sqlite3_malloc(p->nFold * sizeof(char)); if( p->aFold==0 ){ @@ -382,10 +388,15 @@ static int fts5UnicodeCreate( for(i=0; rc==SQLITE_OK && ieRemoveDiacritic = (zArg[0] - '0'); + assert( p->eRemoveDiacritic==FTS5_REMOVE_DIACRITICS_NONE + || p->eRemoveDiacritic==FTS5_REMOVE_DIACRITICS_SIMPLE + || p->eRemoveDiacritic==FTS5_REMOVE_DIACRITICS_COMPLEX + ); } - p->bRemoveDiacritic = (zArg[0]=='1'); }else if( 0==sqlite3_stricmp(azArg[i], "tokenchars") ){ rc = fts5UnicodeAddExceptions(p, zArg, 1); @@ -419,7 +430,7 @@ static int fts5UnicodeCreate( */ static int fts5UnicodeIsAlnum(Unicode61Tokenizer *p, int iCode){ return ( - p->aCategory[sqlite3Fts5UnicodeCategory(iCode)] + p->aCategory[sqlite3Fts5UnicodeCategory((u32)iCode)] ^ fts5UnicodeIsException(p, iCode) ); } @@ -448,7 +459,7 @@ static int fts5UnicodeTokenize( /* Each iteration of this loop gobbles up a contiguous run of separators, ** then the next token. */ while( rc==SQLITE_OK ){ - int iCode; /* non-ASCII codepoint read from input */ + u32 iCode; /* non-ASCII codepoint read from input */ char *zOut = aFold; int is; int ie; @@ -480,7 +491,7 @@ static int fts5UnicodeTokenize( /* Grow the output buffer so that there is sufficient space to fit the ** largest possible utf-8 character. */ if( zOut>pEnd ){ - aFold = sqlite3_malloc(nFold*2); + aFold = sqlite3_malloc64((sqlite3_int64)nFold*2); if( aFold==0 ){ rc = SQLITE_NOMEM; goto tokenize_done; @@ -499,7 +510,7 @@ static int fts5UnicodeTokenize( READ_UTF8(zCsr, zTerm, iCode); if( fts5UnicodeIsAlnum(p,iCode)||sqlite3Fts5UnicodeIsdiacritic(iCode) ){ non_ascii_tokenchar: - iCode = sqlite3Fts5UnicodeFold(iCode, p->bRemoveDiacritic); + iCode = sqlite3Fts5UnicodeFold(iCode, p->eRemoveDiacritic); if( iCode ) WRITE_UTF8(zOut, iCode); }else{ break; @@ -1274,5 +1285,3 @@ int sqlite3Fts5TokenizerInit(fts5_api *pApi){ return rc; } - - diff --git a/ext/fts5/fts5_unicode2.c b/ext/fts5/fts5_unicode2.c index 8c48aaa..d398122 100644 --- a/ext/fts5/fts5_unicode2.c +++ b/ext/fts5/fts5_unicode2.c @@ -1,5 +1,5 @@ /* -** 2012 May 25 +** 2012-05-25 ** ** The author disclaims copyright to this source code. In place of ** a legal notice, here is a blessing: @@ -28,32 +28,48 @@ ** E"). The resuls of passing a codepoint that corresponds to an ** uppercase letter are undefined. */ -static int fts5_remove_diacritic(int c){ +static int fts5_remove_diacritic(int c, int bComplex){ unsigned short aDia[] = { 0, 1797, 1848, 1859, 1891, 1928, 1940, 1995, 2024, 2040, 2060, 2110, 2168, 2206, 2264, 2286, 2344, 2383, 2472, 2488, 2516, 2596, 2668, 2732, 2782, 2842, 2894, 2954, 2984, 3000, 3028, 3336, - 3456, 3696, 3712, 3728, 3744, 3896, 3912, 3928, - 3968, 4008, 4040, 4106, 4138, 4170, 4202, 4234, - 4266, 4296, 4312, 4344, 4408, 4424, 4472, 4504, - 6148, 6198, 6264, 6280, 6360, 6429, 6505, 6529, - 61448, 61468, 61534, 61592, 61642, 61688, 61704, 61726, - 61784, 61800, 61836, 61880, 61914, 61948, 61998, 62122, - 62154, 62200, 62218, 62302, 62364, 62442, 62478, 62536, - 62554, 62584, 62604, 62640, 62648, 62656, 62664, 62730, - 62924, 63050, 63082, 63274, 63390, + 3456, 3696, 3712, 3728, 3744, 3766, 3832, 3896, + 3912, 3928, 3944, 3968, 4008, 4040, 4056, 4106, + 4138, 4170, 4202, 4234, 4266, 4296, 4312, 4344, + 4408, 4424, 4442, 4472, 4488, 4504, 6148, 6198, + 6264, 6280, 6360, 6429, 6505, 6529, 61448, 61468, + 61512, 61534, 61592, 61610, 61642, 61672, 61688, 61704, + 61726, 61784, 61800, 61816, 61836, 61880, 61896, 61914, + 61948, 61998, 62062, 62122, 62154, 62184, 62200, 62218, + 62252, 62302, 62364, 62410, 62442, 62478, 62536, 62554, + 62584, 62604, 62640, 62648, 62656, 62664, 62730, 62766, + 62830, 62890, 62924, 62974, 63032, 63050, 63082, 63118, + 63182, 63242, 63274, 63310, 63368, 63390, }; - char aChar[] = { - '\0', 'a', 'c', 'e', 'i', 'n', 'o', 'u', 'y', 'y', 'a', 'c', - 'd', 'e', 'e', 'g', 'h', 'i', 'j', 'k', 'l', 'n', 'o', 'r', - 's', 't', 'u', 'u', 'w', 'y', 'z', 'o', 'u', 'a', 'i', 'o', - 'u', 'g', 'k', 'o', 'j', 'g', 'n', 'a', 'e', 'i', 'o', 'r', - 'u', 's', 't', 'h', 'a', 'e', 'o', 'y', '\0', '\0', '\0', '\0', - '\0', '\0', '\0', '\0', 'a', 'b', 'd', 'd', 'e', 'f', 'g', 'h', - 'h', 'i', 'k', 'l', 'l', 'm', 'n', 'p', 'r', 'r', 's', 't', - 'u', 'v', 'w', 'w', 'x', 'y', 'z', 'h', 't', 'w', 'y', 'a', - 'e', 'i', 'o', 'u', 'y', +#define HIBIT ((unsigned char)0x80) + unsigned char aChar[] = { + '\0', 'a', 'c', 'e', 'i', 'n', + 'o', 'u', 'y', 'y', 'a', 'c', + 'd', 'e', 'e', 'g', 'h', 'i', + 'j', 'k', 'l', 'n', 'o', 'r', + 's', 't', 'u', 'u', 'w', 'y', + 'z', 'o', 'u', 'a', 'i', 'o', + 'u', 'u'|HIBIT, 'a'|HIBIT, 'g', 'k', 'o', + 'o'|HIBIT, 'j', 'g', 'n', 'a'|HIBIT, 'a', + 'e', 'i', 'o', 'r', 'u', 's', + 't', 'h', 'a', 'e', 'o'|HIBIT, 'o', + 'o'|HIBIT, 'y', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', 'a', 'b', + 'c'|HIBIT, 'd', 'd', 'e'|HIBIT, 'e', 'e'|HIBIT, + 'f', 'g', 'h', 'h', 'i', 'i'|HIBIT, + 'k', 'l', 'l'|HIBIT, 'l', 'm', 'n', + 'o'|HIBIT, 'p', 'r', 'r'|HIBIT, 'r', 's', + 's'|HIBIT, 't', 'u', 'u'|HIBIT, 'v', 'w', + 'w', 'x', 'y', 'z', 'h', 't', + 'w', 'y', 'a', 'a'|HIBIT, 'a'|HIBIT, 'a'|HIBIT, + 'e', 'e'|HIBIT, 'e'|HIBIT, 'i', 'o', 'o'|HIBIT, + 'o'|HIBIT, 'o'|HIBIT, 'u', 'u'|HIBIT, 'u'|HIBIT, 'y', }; unsigned int key = (((unsigned int)c)<<3) | 0x00000007; @@ -70,7 +86,8 @@ static int fts5_remove_diacritic(int c){ } } assert( key>=aDia[iRes] ); - return ((c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : (int)aChar[iRes]); + if( bComplex==0 && (aChar[iRes] & 0x80) ) return c; + return (c > (aDia[iRes]>>3) + (aDia[iRes]&0x07)) ? c : ((int)aChar[iRes] & 0x7F); } @@ -83,8 +100,8 @@ int sqlite3Fts5UnicodeIsdiacritic(int c){ unsigned int mask1 = 0x000361F8; if( c<768 || c>817 ) return 0; return (c < 768+32) ? - (mask0 & (1 << (c-768))) : - (mask1 & (1 << (c-768-32))); + (mask0 & ((unsigned int)1 << (c-768))) : + (mask1 & ((unsigned int)1 << (c-768-32))); } @@ -97,7 +114,7 @@ int sqlite3Fts5UnicodeIsdiacritic(int c){ ** The results are undefined if the value passed to this function ** is less than zero. */ -int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){ +int sqlite3Fts5UnicodeFold(int c, int eRemoveDiacritic){ /* Each entry in the following array defines a rule for folding a range ** of codepoints to lower case. The rule applies to a range of nRange ** codepoints starting at codepoint iCode. @@ -220,7 +237,9 @@ int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){ assert( ret>0 ); } - if( bRemoveDiacritic ) ret = fts5_remove_diacritic(ret); + if( eRemoveDiacritic ){ + ret = fts5_remove_diacritic(ret, eRemoveDiacritic==2); + } } else if( c>=66560 && c<66600 ){ @@ -231,12 +250,6 @@ int sqlite3Fts5UnicodeFold(int c, int bRemoveDiacritic){ } -#if 0 -int sqlite3Fts5UnicodeNCat(void) { - return 32; -} -#endif - int sqlite3Fts5UnicodeCatParse(const char *zCat, u8 *aArray){ aArray[0] = 1; switch( zCat[0] ){ @@ -718,7 +731,7 @@ static u16 aFts5UnicodeData[] = { 34, 3074, 7692, 63, 63, }; -int sqlite3Fts5UnicodeCategory(int iCode) { +int sqlite3Fts5UnicodeCategory(u32 iCode) { int iRes = -1; int iHi; int iLo; @@ -756,9 +769,8 @@ void sqlite3Fts5UnicodeAscii(u8 *aArray, u8 *aAscii){ int bToken = aArray[ aFts5UnicodeData[iTbl] & 0x1F ]; int n = (aFts5UnicodeData[iTbl] >> 5) + i; for(; i<128 && i3 && n<=9 ); return n; } @@ -342,4 +342,3 @@ int sqlite3Fts5GetVarintLen(u32 iVal){ if( iVal<(1 << 28) ) return 4; return 5; } - diff --git a/ext/fts5/fts5_vocab.c b/ext/fts5/fts5_vocab.c index e475d07..2550c9d 100644 --- a/ext/fts5/fts5_vocab.c +++ b/ext/fts5/fts5_vocab.c @@ -55,7 +55,7 @@ struct Fts5VocabTable { struct Fts5VocabCursor { sqlite3_vtab_cursor base; sqlite3_stmt *pStmt; /* Statement holding lock on pIndex */ - Fts5Index *pIndex; /* Associated FTS5 index */ + Fts5Table *pFts5; /* Associated FTS5 table */ int bEof; /* True if this cursor is at EOF */ Fts5IndexIter *pIter; /* Term/rowid iterator object */ @@ -64,7 +64,6 @@ struct Fts5VocabCursor { char *zLeTerm; /* (term <= $zLeTerm) paramater, or NULL */ /* These are used by 'col' tables only */ - Fts5Config *pConfig; /* Fts5 table configuration */ int iCol; i64 *aCnt; i64 *aDoc; @@ -327,8 +326,7 @@ static int fts5VocabOpenMethod( sqlite3_vtab_cursor **ppCsr ){ Fts5VocabTable *pTab = (Fts5VocabTable*)pVTab; - Fts5Index *pIndex = 0; - Fts5Config *pConfig = 0; + Fts5Table *pFts5 = 0; Fts5VocabCursor *pCsr = 0; int rc = SQLITE_OK; sqlite3_stmt *pStmt = 0; @@ -347,31 +345,34 @@ static int fts5VocabOpenMethod( if( pStmt && sqlite3_step(pStmt)==SQLITE_ROW ){ i64 iId = sqlite3_column_int64(pStmt, 0); - pIndex = sqlite3Fts5IndexFromCsrid(pTab->pGlobal, iId, &pConfig); + pFts5 = sqlite3Fts5TableFromCsrid(pTab->pGlobal, iId); } - if( rc==SQLITE_OK && pIndex==0 ){ - rc = sqlite3_finalize(pStmt); - pStmt = 0; - if( rc==SQLITE_OK ){ - pVTab->zErrMsg = sqlite3_mprintf( - "no such fts5 table: %s.%s", pTab->zFts5Db, pTab->zFts5Tbl - ); - rc = SQLITE_ERROR; + if( rc==SQLITE_OK ){ + if( pFts5==0 ){ + rc = sqlite3_finalize(pStmt); + pStmt = 0; + if( rc==SQLITE_OK ){ + pVTab->zErrMsg = sqlite3_mprintf( + "no such fts5 table: %s.%s", pTab->zFts5Db, pTab->zFts5Tbl + ); + rc = SQLITE_ERROR; + } + }else{ + rc = sqlite3Fts5FlushToDisk(pFts5); } } if( rc==SQLITE_OK ){ - int nByte = pConfig->nCol * sizeof(i64) * 2 + sizeof(Fts5VocabCursor); + int nByte = pFts5->pConfig->nCol * sizeof(i64)*2 + sizeof(Fts5VocabCursor); pCsr = (Fts5VocabCursor*)sqlite3Fts5MallocZero(&rc, nByte); } if( pCsr ){ - pCsr->pIndex = pIndex; + pCsr->pFts5 = pFts5; pCsr->pStmt = pStmt; - pCsr->pConfig = pConfig; pCsr->aCnt = (i64*)&pCsr[1]; - pCsr->aDoc = &pCsr->aCnt[pConfig->nCol]; + pCsr->aDoc = &pCsr->aCnt[pFts5->pConfig->nCol]; }else{ sqlite3_finalize(pStmt); } @@ -387,6 +388,7 @@ static void fts5VocabResetCursor(Fts5VocabCursor *pCsr){ sqlite3_free(pCsr->zLeTerm); pCsr->nLeTerm = -1; pCsr->zLeTerm = 0; + pCsr->bEof = 0; } /* @@ -425,7 +427,7 @@ static int fts5VocabInstanceNewTerm(Fts5VocabCursor *pCsr){ } static int fts5VocabInstanceNext(Fts5VocabCursor *pCsr){ - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; int rc = SQLITE_OK; Fts5IndexIter *pIter = pCsr->pIter; i64 *pp = &pCsr->iInstPos; @@ -460,7 +462,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; Fts5VocabTable *pTab = (Fts5VocabTable*)pCursor->pVtab; int rc = SQLITE_OK; - int nCol = pCsr->pConfig->nCol; + int nCol = pCsr->pFts5->pConfig->nCol; pCsr->rowid++; @@ -482,6 +484,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ int nTerm; zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); + assert( nTerm>=0 ); if( pCsr->nLeTerm>=0 ){ int nCmp = MIN(nTerm, pCsr->nLeTerm); int bCmp = memcmp(pCsr->zLeTerm, zTerm, nCmp); @@ -498,7 +501,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ assert( pTab->eType==FTS5_VOCAB_COL || pTab->eType==FTS5_VOCAB_ROW ); while( rc==SQLITE_OK ){ - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; const u8 *pPos; int nPos; /* Position list */ i64 iPos = 0; /* 64-bit position read from poslist */ int iOff = 0; /* Current offset within position list */ @@ -521,7 +524,6 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ int iCol = -1; while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff, &iPos) ){ int ii = FTS5_POS2COLUMN(iPos); - pCsr->aCnt[ii]++; if( iCol!=ii ){ if( ii>=nCol ){ rc = FTS5_CORRUPT; @@ -530,6 +532,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ pCsr->aDoc[ii]++; iCol = ii; } + pCsr->aCnt[ii]++; } }else if( eDetail==FTS5_DETAIL_COLUMNS ){ while( 0==sqlite3Fts5PoslistNext64(pPos, nPos, &iOff,&iPos) ){ @@ -558,7 +561,9 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ if( rc==SQLITE_OK ){ zTerm = sqlite3Fts5IterTerm(pCsr->pIter, &nTerm); - if( nTerm!=pCsr->term.n || memcmp(zTerm, pCsr->term.p, nTerm) ){ + if( nTerm!=pCsr->term.n + || (nTerm>0 && memcmp(zTerm, pCsr->term.p, nTerm)) + ){ break; } if( sqlite3Fts5IterEof(pCsr->pIter) ) break; @@ -569,7 +574,7 @@ static int fts5VocabNextMethod(sqlite3_vtab_cursor *pCursor){ if( rc==SQLITE_OK && pCsr->bEof==0 && pTab->eType==FTS5_VOCAB_COL ){ while( pCsr->aDoc[pCsr->iCol]==0 ) pCsr->iCol++; - assert( pCsr->iColpConfig->nCol ); + assert( pCsr->iColpFts5->pConfig->nCol ); } return rc; } @@ -616,6 +621,7 @@ static int fts5VocabFilterMethod( } if( pLe ){ const char *zCopy = (const char *)sqlite3_value_text(pLe); + if( zCopy==0 ) zCopy = ""; pCsr->nLeTerm = sqlite3_value_bytes(pLe); pCsr->zLeTerm = sqlite3_malloc(pCsr->nLeTerm+1); if( pCsr->zLeTerm==0 ){ @@ -627,14 +633,15 @@ static int fts5VocabFilterMethod( } if( rc==SQLITE_OK ){ - rc = sqlite3Fts5IndexQuery(pCsr->pIndex, zTerm, nTerm, f, 0, &pCsr->pIter); + Fts5Index *pIndex = pCsr->pFts5->pIndex; + rc = sqlite3Fts5IndexQuery(pIndex, zTerm, nTerm, f, 0, &pCsr->pIter); } if( rc==SQLITE_OK && eType==FTS5_VOCAB_INSTANCE ){ rc = fts5VocabInstanceNewTerm(pCsr); } - if( rc==SQLITE_OK - && !pCsr->bEof - && (eType!=FTS5_VOCAB_INSTANCE || pCsr->pConfig->eDetail!=FTS5_DETAIL_NONE) + if( rc==SQLITE_OK && !pCsr->bEof + && (eType!=FTS5_VOCAB_INSTANCE + || pCsr->pFts5->pConfig->eDetail!=FTS5_DETAIL_NONE) ){ rc = fts5VocabNextMethod(pCursor); } @@ -657,7 +664,7 @@ static int fts5VocabColumnMethod( int iCol /* Index of column to read value from */ ){ Fts5VocabCursor *pCsr = (Fts5VocabCursor*)pCursor; - int eDetail = pCsr->pConfig->eDetail; + int eDetail = pCsr->pFts5->pConfig->eDetail; int eType = ((Fts5VocabTable*)(pCursor->pVtab))->eType; i64 iVal = 0; @@ -669,7 +676,7 @@ static int fts5VocabColumnMethod( assert( iCol==1 || iCol==2 || iCol==3 ); if( iCol==1 ){ if( eDetail!=FTS5_DETAIL_NONE ){ - const char *z = pCsr->pConfig->azCol[pCsr->iCol]; + const char *z = pCsr->pFts5->pConfig->azCol[pCsr->iCol]; sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC); } }else if( iCol==2 ){ @@ -697,8 +704,8 @@ static int fts5VocabColumnMethod( }else if( eDetail==FTS5_DETAIL_COLUMNS ){ ii = (int)pCsr->iInstPos; } - if( ii>=0 && iipConfig->nCol ){ - const char *z = pCsr->pConfig->azCol[ii]; + if( ii>=0 && iipFts5->pConfig->nCol ){ + const char *z = pCsr->pFts5->pConfig->azCol[ii]; sqlite3_result_text(pCtx, z, -1, SQLITE_STATIC); } break; diff --git a/ext/fts5/test/fts5aa.test b/ext/fts5/test/fts5aa.test index b6a2499..0fe6093 100644 --- a/ext/fts5/test/fts5aa.test +++ b/ext/fts5/test/fts5aa.test @@ -38,8 +38,7 @@ do_execsql_test 1.0 { do_execsql_test 1.1 { DROP TABLE t1; SELECT name, sql FROM sqlite_master; -} { -} +} {} #------------------------------------------------------------------------- # diff --git a/ext/fts5/test/fts5ai.test b/ext/fts5/test/fts5ai.test index 24e780a..20e1069 100644 --- a/ext/fts5/test/fts5ai.test +++ b/ext/fts5/test/fts5ai.test @@ -51,6 +51,12 @@ do_execsql_test 1.1 { do_execsql_test 1.2 { INSERT INTO t1(t1) VALUES('integrity-check'); } + +do_execsql_test 1.3 { + SAVEPOINT one; + INSERT INTO t1 VALUES('v w x'); + ROLLBACK TO one; +} } diff --git a/ext/fts5/test/fts5ak.test b/ext/fts5/test/fts5ak.test index cab0ae2..0a3cd6a 100644 --- a/ext/fts5/test/fts5ak.test +++ b/ext/fts5/test/fts5ak.test @@ -144,6 +144,14 @@ do_execsql_test 3.1 { {[a b c d e]} } +do_execsql_test 3.2 { + SELECT highlight(ft, 0, NULL, NULL) FROM ft WHERE ft MATCH 'a+b+c AND c+d+e'; +} { + {a b c x c d e} + {a b c c d e} + {a b c d e} +} + } finish_test diff --git a/ext/fts5/test/fts5circref.test b/ext/fts5/test/fts5circref.test new file mode 100644 index 0000000..ea99219 --- /dev/null +++ b/ext/fts5/test/fts5circref.test @@ -0,0 +1,80 @@ +# 2018 Dec 22 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# This file implements regression tests for SQLite library. The +# focus of this script is testing the FTS5 module. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5circref + +# If SQLITE_ENABLE_FTS5 is not defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE tt USING fts5(a); + SELECT name FROM sqlite_master ORDER BY 1; +} { + tt tt_config tt_content tt_data tt_docsize tt_idx +} +db_save_and_close + +foreach {tn schema sql} { + 1 { + CREATE TRIGGER tr1 AFTER INSERT ON tt_config BEGIN + SELECT * FROM tt; + END; + } { + INSERT INTO tt(tt, rank) VALUES('usermerge', 4); + } + + 2 { + CREATE TRIGGER tr1 AFTER INSERT ON tt_docsize BEGIN + SELECT * FROM tt; + END; + } { + INSERT INTO tt(a) VALUES('one two three'); + } + + 3 { + CREATE TRIGGER tr1 AFTER INSERT ON tt_content BEGIN + SELECT * FROM tt; + END; + } { + INSERT INTO tt(a) VALUES('one two three'); + } + + 4 { + CREATE TRIGGER tr1 AFTER INSERT ON tt_data BEGIN + SELECT * FROM tt; + END; + } { + INSERT INTO tt(a) VALUES('one two three'); + } + + 5 { + CREATE TRIGGER tr1 AFTER INSERT ON tt_idx BEGIN + SELECT * FROM tt; + END; + } { + INSERT INTO tt(a) VALUES('one two three'); + } +} { + db_restore_and_reopen + do_execsql_test 1.1.$tn.1 $schema + do_catchsql_test 1.1.$tn.2 $sql {1 {SQL logic error}} + db close +} + + +finish_test diff --git a/ext/fts5/test/fts5corrupt3.test b/ext/fts5/test/fts5corrupt3.test index ec823b3..d74fbcc 100644 --- a/ext/fts5/test/fts5corrupt3.test +++ b/ext/fts5/test/fts5corrupt3.test @@ -23,6 +23,7 @@ ifcapable !fts5 { return } sqlite3_fts5_may_be_corrupt 1 +database_may_be_corrupt proc create_t1 {} { expr srand(0) @@ -35,8 +36,6 @@ proc create_t1 {} { } } -if 1 { - # Create a simple FTS5 table containing 100 documents. Each document # contains 10 terms, each of which start with the character "x". # @@ -380,8 +379,6 @@ do_test 7.1 { } } {} -} - #------------------------------------------------------------------------ # Corruption within the structure record. # @@ -416,5 +413,7374 @@ do_catchsql_test 9.2.2 { SELECT * FROM t1('one AND two'); } {1 {database disk image is malformed}} +#------------------------------------------------------------------------- +reset_db +do_test 10.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename c9.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 06 36 b0 a0 10 21 ck.....ft..6...! +| 4064: d6 f7 07 46 96 d6 97 a6 05 01 03 00 10 03 03 0f ...F............ +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f4 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 62 6c 65 74 31 74 31 43 52 45 41 54 45 20 heblet1t1CREATE +| page 8 offset 28672 +| 0: 56 49 52 54 55 41 4c 20 54 41 42 4c 45 20 74 31 VIRTUAL TABLE t1 +| 16: 20 55 53 49 4e 47 20 66 74 73 35 28 63 6f 6e 74 USING fts5(cont +| 32: 65 6e 74 29 0d 00 00 00 03 0f bd 00 0f e8 0f ef ent)............ +| 48: 0f bd 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| end c9.db + }] +} {} +do_catchsql_test 10.1 { + SELECT * FROM t1 WHERE t1 MATCH 'abandon'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +# +reset_db +do_test 11.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c10b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ..08...........m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 44 d9 (id INTEGER PRD. +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 06 0f 59 00 0f e8 0f ef 0f bd 0f b0 ......Y......... +| 16: 0f 73 0f 59 00 00 00 00 00 00 00 00 00 00 00 00 .s.Y............ +| 3920: 00 00 00 00 00 00 00 00 00 13 84 80 80 80 80 04 ................ +| 3936: 03 01 2a 0a 00 00 00 00 01 02 02 00 02 01 01 01 ..*............. +| 3952: 02 01 01 36 84 80 80 80 80 03 03 05 66 00 40 00 ...6........f.@. +| 3968: 00 00 01 00 00 00 29 07 30 61 63 74 69 76 65 04 ......).0active. +| 3984: 02 02 02 03 74 6f 6d 06 02 02 05 02 69 63 07 02 ....tom.....ic.. +| 4000: 02 01 06 62 6f 6f 6d 65 72 05 02 02 04 0b 08 07 ...boomer....... +| 4016: 06 84 80 80 80 80 02 03 01 10 01 07 07 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 02 0f f3 00 0f fa 0f f3 00 00 00 00 ................ +| 4080: 00 00 00 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 07 0f b6 00 0f f6 0f ec 0f e0 0f d5 ................ +| 16: 0f ca 0f c1 0f b6 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 09 07 03 00 19 61 74 6f 6d 69 ...........atomi +| 4032: 63 07 06 03 00 15 61 74 6f 6d 09 05 03 00 19 62 c.....atom.....b +| 4048: 6f 6f 6d 65 72 09 04 03 00 19 61 63 74 69 76 65 oomer.....active +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 07 0f d6 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 00 00 00 00 00 00 00 00 00 00 ................ +| 4048: 00 00 00 00 00 00 04 07 03 00 0e 01 04 06 03 00 ................ +| 4064: 0e 01 04 05 03 00 0e 01 04 04 03 00 0e 01 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c10b.db +}]} {} + +# This returns SQLITE_CONSTRAINT instead of SQLITE_CORRUPT. The problem is +# that the corrupted structure-record leads fts5 to try to use a segment-id +# that is already in use. This is caught by the PRIMARY KEY constraint on +# the %_idx table. +# +do_catchsql_test 11.1 { + UPDATE t1 SET content='abc' WHERE content='boomer'; +} {1 {constraint failed}} + +#------------------------------------------------------------------------- +# +reset_db +do_test 12.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c2.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f d8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 20 01 01 01 01 ...$....... .... +| page 3 offset 8192 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 3f e0 ..............?. +| 16: a0 30 30 01 b6 16 26 16 e6 46 f6 e0 80 20 30 01 .00...&..F... 0. +| 32: 76 16 26 16 67 40 80 10 30 01 76 16 26 16 36 b0 v.&.g@..0.v.&.6. +| 48: d0 00 00 00 30 fe e0 00 ff a0 ff 40 fe 00 00 00 ....0......@.... +| page 5 offset 16384 +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c2.db +}]} {} + +do_catchsql_test 11.1 { + SELECT * FROM t1 WHERE t1 MATCH 'abandon'; +} {1 {vtable constructor failed: t1}} + +do_catchsql_test 11.2 { + INSERT INTO t1(t1, rank) VALUES('merge', 500); +} {1 {vtable constructor failed: t1}} + +#------------------------------------------------------------------------- +# +reset_db +do_test 13.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c13.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 4f 69 64 ATE TABLE 't1Oid +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 eb 00 00 00 01 01 01 00 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 01 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f2 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c13.db +SELECT * FROM t1 WHERE t1 MATCH 'abandon'; +}]} {} + +do_catchsql_test 13.1 { + SELECT * FROM t1 WHERE t1 MATCH 'abandon'; +} {1 {vtable constructor failed: t1}} + +#------------------------------------------------------------------------- +reset_db +do_test 14.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c14b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ..08...........m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 0f ef 00 04 0f 18 00 0f e8 0f 18 0f bd 0f 2c ..............., +| 3856: 00 00 00 00 00 00 00 00 12 0a 03 00 2a 00 00 00 ............*... +| 3872: 00 01 02 02 00 02 01 01 01 02 01 01 81 09 88 80 ................ +| 3888: 80 80 80 01 04 00 82 16 00 00 00 79 06 30 61 62 ...........y.0ab +| 3904: 61 63 6b 08 02 07 04 04 6e 64 6f 6e 08 02 05 02 ack.....ndon.... +| 3920: 05 63 74 69 76 65 04 02 02 04 02 0b 02 04 6c 70 .ctive........lp +| 3936: 68 61 08 04 02 0a 02 03 74 6b 6d 06 02 02 03 02 ha......tkm..... +| 3952: 6f 6d 08 02 09 05 02 69 63 07 02 02 01 06 62 61 om.....ic.....ba +| 3968: 63 6b 75 70 08 02 04 02 05 6f 6f 6d 65 72 05 02 ckup.....oomer.. +| 3984: 02 01 0c 63 68 61 6e 6e 65 62 6f 6f 6d 65 72 08 ...channeboomer. +| 4000: 02 08 07 01 6c 08 02 03 01 04 74 65 73 74 08 02 ....l.....test.. +| 4016: 06 04 0a 09 0d 0a 08 07 07 0b 0a 11 06 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 03 9a 07 05 01 03 00 10 08 11 00 on.............. +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 02 0f f3 00 0f fa 0f f3 00 00 00 00 ................ +| 4080: 00 00 00 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 08 0f 6a 00 0f f6 0f ec 0f e0 0f d5 ......j......... +| 16: 0f ca 0f c1 0f b6 0f 6a 00 00 00 00 00 00 00 00 .......j........ +| 3936: 00 00 00 00 00 00 00 00 00 00 4a 08 04 00 81 19 ..........J..... +| 3952: 61 6c 70 68 61 20 63 68 61 6e 6e 65 6c 20 62 61 alpha channel ba +| 3968: 63 6b 75 70 20 61 62 61 6e 64 6f 6e 20 74 65 73 ckup abandon tes +| 3984: 74 20 61 62 61 63 6b 20 63 68 61 6e 6e 65 62 6f t aback channebo +| 4000: 6f 6d 65 72 20 61 74 6f 6d 20 61 6c 70 68 61 20 omer atom alpha +| 4016: 61 63 74 69 76 65 09 07 03 00 19 61 74 6f 6d 69 active.....atomi +| 4032: 63 07 06 03 00 15 61 74 6b 6d 09 05 03 00 19 62 c.....atkm.....b +| 4048: 6f 6f 6d 65 72 09 04 03 00 19 61 63 74 69 76 65 oomer.....active +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0a 04 07 03 00 0e 01 04 06 03 00 ................ +| 4064: 0e 01 04 05 03 00 0e 01 04 04 03 00 0e 01 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c14b.db +}]} {} + +do_catchsql_test 14.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +#--------------------------------------------------------------------------- +# +reset_db +do_test 15.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename c16.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 00 0f f6 0f ec ..!!...tabl..... +| 3680: 0f e0 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ..sizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 00 02 22 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 04 67 90 38 2a 07 05 01 03 00 10 03 03 0f on.g.8*......... +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f4 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| page 8 offset 28672 +| 0: 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 31 5f .......-tablet1_ +| 16: 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 54 45 idxt1_idx.CREATE +| 32: 20 54 41 42 4c 45 20 27 74 31 5f 66 17 42 03 30 TABLE 't1_f.B.0 +| 48: 01 00 00 10 10 04 02 02 00 00 00 00 00 00 00 00 ................ +| 64: 70 00 00 00 00 00 00 00 00 00 00 00 70 00 00 00 p...........p... +| end c16.db +}]} {} + +do_catchsql_test 15.1 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +#--------------------------------------------------------------------------- +# +reset_db +do_test 16.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c17.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 00 02 22 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 41 01 ...$..........A. +| page 3 offset 8192 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f4 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c17.db +}]} {} + +do_catchsql_test 16.1 { +INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {vtable constructor failed: t1}} + +#-------------------------------------------------------------------------- +reset_db +do_test 17.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c18.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 00 02 22 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 00 0a aa aa aa aa aa aa aa aa aa ...$............ +| page 3 offset 8192 +| 0: aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa aa ................ +| 16: aa aa aa aa aa aa aa aa 00 00 10 10 10 00 10 10 ................ +| 32: 10 10 a0 00 00 00 10 ff a0 00 ff 52 05 64 95 25 ...........R.d.% +| 48: 45 54 14 c2 05 44 14 24 c4 52 07 43 12 05 55 34 ET...D.$.R.C..U4 +| 64: 94 e4 72 06 67 47 33 52 86 36 f6 e7 46 56 e7 42 ..r.gG3R.6..FV.B +| 80: 90 d0 00 00 00 30 fb d0 00 fe 80 fe f0 fb 00 00 .....0.......... +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f4 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c18.db +}]} {} + +do_catchsql_test 17.1 { + SELECT * FROM t1 WHERE t1 MATCH 'abandon'; +} {1 {vtable constructor failed: t1}} + +#-------------------------------------------------------------------------- +reset_db +do_test 18.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c19b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ..08...........m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 09 a6 00 06 09 22 00 0f e8 09 22 0f bd 0f 2c ..............., +| 16: 09 bd 09 3c 00 00 00 00 00 00 00 00 00 00 00 00 ...<............ +| 2336: 00 00 18 0a 03 00 36 00 00 00 00 01 04 04 00 04 ......6......... +| 2352: 01 01 01 02 01 01 03 01 01 04 01 01 63 90 80 80 ............c... +| 2368: 80 80 01 04 00 81 4a 00 00 00 56 06 30 61 62 61 ......J...V.0aba +| 2384: 63 6b 08 01 04 04 6e 64 6f 6e 03 01 05 01 02 05 ck....ndon...... +| 2400: 63 74 69 76 65 08 01 02 04 6c 70 68 61 08 01 02 ctive....lpha... +| 2416: 03 74 6f 6d 08 01 01 06 62 61 63 6b 75 70 08 01 .tom....backup.. +| 2432: 01 0c 63 68 61 6e 6e 65 62 6f 6f 6d 65 72 08 01 ..channeboomer.. +| 2448: 07 01 6c 08 01 01 04 74 65 73 74 08 01 04 09 0a ..l....test..... +| 2464: 09 08 07 0a 10 05 0f 18 00 17 30 00 00 00 00 01 ..........0..... +| 2480: 03 03 00 03 01 01 01 02 01 01 03 01 01 8a 53 8c ..............S. +| 2496: 80 80 80 80 01 04 00 95 2a 00 00 05 35 0d 30 30 ........*...5.00 +| 2512: 31 30 66 66 61 30 30 30 66 66 61 05 02 1c 02 49 10ffa000ffa....I +| 2528: 33 34 33 35 32 34 35 34 31 35 34 34 35 32 30 35 3435245415445205 +| 2544: 34 34 31 34 32 34 63 34 35 32 30 32 37 37 34 33 441424c452027743 +| 2560: 31 35 66 36 39 36 34 37 38 32 37 32 38 37 33 36 15f6964782728736 +| 2576: 35 36 37 36 39 36 34 32 63 32 30 37 34 36 35 37 56769642c2074657 +| 2592: 32 36 64 32 63 32 30 37 30 05 02 12 02 3b 36 31 26d2c2070....;61 +| 2608: 37 32 31 32 31 30 31 37 37 37 34 36 31 36 32 35 7212101777461625 +| 2624: 63 36 35 37 34 33 31 35 66 36 33 36 66 36 65 37 c6574315f636f6e7 +| 2640: 34 36 35 36 65 37 34 37 34 33 31 35 66 36 33 36 4656e7474315f636 +| 2656: 66 36 65 37 34 36 35 36 65 05 04 07 07 01 04 31 f6e74656e......1 +| 2672: 66 62 64 05 02 19 01 44 32 34 38 34 38 30 38 30 fbd....D24848080 +| 2688: 38 30 38 30 30 31 30 33 30 30 34 65 30 30 30 30 80800103004e0000 +| 2704: 30 30 31 65 30 36 33 30 36 31 36 32 36 31 36 33 001e063061626163 +| 2720: 36 62 30 31 30 32 30 32 30 34 30 32 36 36 37 34 6b01020204026674 +| 2736: 30 32 30 32 30 32 30 34 30 34 36 65 05 02 1a 02 02020204046e.... +| 2752: 03 66 65 72 05 02 1d 01 28 33 65 37 34 36 35 36 .fer....(3e74656 +| 2768: 65 37 34 32 39 30 64 30 30 30 30 30 30 30 33 30 e74290d000000030 +| 2784: 66 62 64 30 30 30 66 65 38 30 66 65 66 30 66 62 fbd000fe80fef0fb +| 2800: 64 05 02 18 01 4a 34 31 35 32 35 39 32 30 34 62 d....J415259204b +| 2816: 34 35 35 39 32 63 32 30 36 32 36 63 36 66 36 33 45592c20626c6f63 +| 2832: 36 62 32 30 34 32 34 63 34 66 34 32 32 39 33 61 6b20424c4f42293a +| 2848: 30 31 30 36 31 37 31 31 31 31 30 38 36 33 37 34 0106171111086374 +| 2864: 36 31 36 32 36 63 36 35 37 34 33 31 37 34 33 31 61626c6574317431 +| 2880: 05 02 16 02 49 33 35 32 34 35 34 31 35 34 34 35 ....I35245415445 +| 2896: 32 30 35 36 34 39 35 32 35 34 35 35 34 31 34 63 205649525455414c +| 2912: 32 30 35 34 34 31 34 32 34 63 34 35 32 30 37 34 205441424c452074 +| 2928: 33 31 6f 30 35 35 35 33 34 39 34 65 34 37 32 30 31o05553494e4720 +| 2944: 36 36 37 34 37 33 33 35 32 38 36 33 36 66 05 02 6674733528636f.. +| 2960: 17 02 49 35 32 30 35 34 34 31 34 32 34 63 34 35 ..I5205441424c45 +| 2976: 32 30 32 37 37 34 33 31 35 66 36 33 36 66 36 65 202774315f636f6e +| 2992: 37 34 36 35 36 65 37 34 32 37 32 38 36 39 36 34 74656e7427286964 +| 3008: 32 30 34 39 34 65 35 34 34 35 34 37 34 35 35 32 20494e5445474552 +| 3024: 32 30 35 30 35 32 34 39 34 64 34 31 05 02 0e 44 205052494d41...D +| 3040: 29 62 30 35 30 37 31 37 32 31 32 31 30 31 38 31 )b05071721210181 +| 3056: 30 31 37 34 36 31 36 32 36 63 36 35 37 34 33 31 017461626c657431 +| 3072: 35 66 36 34 36 66 36 33 37 33 05 02 09 01 4a 35 5f646f6373....J5 +| 3088: 32 34 35 34 31 35 34 34 35 32 30 35 34 34 31 34 2454154452054414 +| 3104: 32 34 63 34 35 32 30 32 37 37 34 33 31 35 66 36 24c45202774315f6 +| 3120: 34 36 31 37 34 36 31 32 37 32 38 36 39 36 34 32 4617461272869642 +| 3136: 30 34 39 34 65 35 34 34 35 34 37 34 35 35 32 32 0494e54454745522 +| 3152: 30 35 30 35 32 34 39 34 64 05 02 15 03 3a 35 39 05052494d....:59 +| 3168: 32 30 34 62 34 35 35 39 32 63 32 30 36 33 33 30 204b45592c206330 +| 3184: 32 39 36 39 30 33 30 37 31 37 31 39 31 39 30 31 2969030717191901 +| 3200: 38 31 32 64 37 34 36 31 36 32 36 63 36 35 37 34 812d7461626c6574 +| 3216: 33 31 35 66 36 39 79 79 05 02 0f 02 49 34 32 30 315f69yy....I420 +| 3232: 35 32 34 66 35 37 34 39 34 34 35 35 30 32 30 37 524f574944550207 +| 3248: 31 37 31 62 31 62 30 31 38 31 30 31 37 34 36 31 171b1b0181017461 +| 3264: 36 32 36 63 36 37 37 34 33 31 35 66 36 34 36 31 626c6774315f6461 +| 3280: 37 34 36 31 37 34 33 31 35 66 36 34 36 31 37 34 746174315f646174 +| 3296: 36 31 30 32 34 33 05 02 14 02 07 66 36 39 36 34 610243.....f6964 +| 3312: 37 38 05 02 11 01 4a 36 34 36 66 36 65 30 33 30 78....J646f6e030 +| 3328: 32 30 32 30 34 30 61 30 37 30 35 30 31 30 33 30 202040a070501030 +| 3344: 30 31 30 30 33 30 33 30 66 30 61 30 33 30 30 32 01003030f0a03002 +| 3360: 34 30 30 30 30 30 30 30 30 30 31 30 31 30 31 30 4000000000101010 +| 3376: 30 30 31 30 31 30 31 30 31 30 61 30 30 30 30 30 0010101010a00000 +| 3392: 30 05 02 1b 02 49 35 32 37 32 38 36 39 36 34 32 0....I5272869642 +| 3408: 30 34 39 34 65 35 34 34 35 34 37 34 35 35 32 32 0494e54454745522 +| 3424: 30 35 30 35 32 34 39 34 64 34 31 35 32 35 39 32 05052494d4152592 +| 3440: 30 34 62 34 35 35 39 32 63 32 30 37 33 37 61 32 04b45592c20737a2 +| 3456: 30 34 32 34 63 34 66 34 32 32 39 35 35 30 34 05 0424c4f42295504. +| 3472: 04 06 07 02 49 37 36 65 36 66 32 63 32 30 35 30 ....I76e6f2c2050 +| 3488: 35 32 34 39 34 64 34 31 35 32 35 39 32 30 34 62 52494d415259204b +| 3504: 34 35 35 39 32 38 37 33 36 35 36 37 36 39 36 34 4559287365676964 +| 3520: 32 63 32 30 37 34 36 35 37 32 36 64 32 39 32 39 2c207465726d2929 +| 3536: 32 30 35 37 34 39 35 34 34 38 34 66 35 35 05 02 20574954484f55.. +| 3552: 13 02 49 39 37 61 36 35 37 34 33 31 35 66 36 34 ..I97a6574315f64 +| 3568: 36 66 36 33 37 33 36 39 37 61 36 35 30 35 34 33 6f6373697a650543 +| 3584: 35 32 34 35 34 31 35 34 34 35 32 30 35 34 34 31 5245415445205441 +| 3600: 34 32 34 63 34 35 32 30 32 37 37 34 33 31 35 66 424c45202774315f +| 3616: 36 34 36 66 36 33 37 33 36 39 37 61 05 04 05 07 646f6373697a.... +| 3632: 01 0e 37 34 30 34 34 33 35 32 34 35 34 31 35 34 ..74044352454154 +| 3648: 05 04 08 07 02 49 36 32 39 32 30 35 37 34 39 35 .....I6292057495 +| 3664: 34 34 38 34 66 35 35 35 34 32 30 35 32 34 66 35 4484f555420524f5 +| 3680: 37 34 39 34 34 35 62 30 35 30 37 31 37 32 31 32 749445b050717212 +| 3696: 31 30 31 38 31 30 31 37 34 36 31 36 32 36 63 36 10181017461626c6 +| 3712: 35 37 34 33 31 35 66 36 34 36 66 36 33 37 33 05 574315f646f6373. +| 3728: 02 04 01 06 62 61 63 6b 75 70 05 02 1e 02 05 65 ....backup.....e +| 3744: 61 6d 65 72 05 02 02 02 05 6f 6f 6d 65 72 05 01 amer.....oomer.. +| 3760: 02 40 75 6d 6d 32 34 63 34 35 32 30 32 37 37 34 .@umm24c45202774 +| 3776: 33 31 35 66 36 33 36 66 36 65 36 36 36 39 36 37 315f636f6e666967 +| 3792: 32 37 32 38 36 62 32 30 35 30 35 32 34 39 34 64 27286b205052494d +| 3808: 34 31 35 32 35 39 32 30 34 62 34 35 35 39 32 63 415259204b45592c +| 3824: 32 30 05 02 03 01 04 79 65 6b 72 05 02 10 04 11 20.....yekr..... +| 3840: 4e 41 09 49 08 2d 4f 4e 4e 2e 4f 3f 4e 0c 4f 4f NA.I.-ONN.O?N.OO +| 3856: 4e 4f 14 4e 0b 0a 09 45 0f ef 00 14 2a 00 00 00 NO.N...E....*... +| 3872: 00 01 02 02 00 02 01 01 01 02 01 01 81 09 88 80 ................ +| 3888: 80 80 80 01 04 00 82 16 00 00 00 79 06 30 61 62 ...........y.0ab +| 3904: 61 63 6b 08 02 07 04 04 6e 64 6f 6e 08 02 05 02 ack.....ndon.... +| 3920: 05 63 74 69 76 65 04 02 02 04 02 0b 02 04 6c 70 .ctive........lp +| 3936: 68 61 08 04 02 0a 02 03 74 6b 6d 06 02 02 03 02 ha......tkm..... +| 3952: 6f 6d 08 02 09 05 02 69 63 07 02 02 01 06 62 61 om.....ic.....ba +| 3968: 63 6b 75 70 08 02 04 02 05 6f 6f 6d 65 72 05 02 ckup.....oomer.. +| 3984: 02 01 0c 63 68 61 6e 6e 65 62 6f 6f 6d 65 72 08 ...channeboomer. +| 4000: 02 08 07 01 6c 08 02 03 01 04 74 65 73 74 08 02 ....l.....test.. +| 4016: 06 04 0a 09 0d 0a 08 07 07 0b 0a 11 06 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 08 02 04 02 66 74 00 02 22 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 06 22 00 on.............. +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 04 0f e5 00 0f fa 0f f3 0f ec 0f e5 ................ +| 4064: 00 00 00 00 00 06 04 01 0c 01 04 02 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 0f 68 00 06 08 98 00 0f f6 0f ec 0f d5 08 98 ..h............. +| 16: 0f c1 0f b6 0f 68 0f 68 00 00 00 00 00 00 00 00 .....h.h........ +| 2192: 00 00 00 00 00 00 00 00 8d 4d 05 04 00 9b 1f 62 .........M.....b +| 2208: 65 61 6d 65 72 20 62 75 6d 6d 32 34 63 34 35 32 eamer bumm24c452 +| 2224: 30 32 37 37 34 33 31 35 66 36 33 36 66 36 65 36 02774315f636f6e6 +| 2240: 36 36 39 36 37 32 37 32 38 36 62 32 30 35 30 35 6696727286b20505 +| 2256: 32 34 39 34 64 34 31 35 32 35 39 32 30 34 62 34 2494d415259204b4 +| 2272: 35 35 39 32 63 32 30 0a 37 36 32 39 32 30 35 37 5592c20.76292057 +| 2288: 34 39 35 34 34 38 34 66 35 35 35 34 32 30 35 32 4954484f55542052 +| 2304: 34 66 35 37 34 39 34 34 35 62 30 35 30 37 31 37 4f5749445b050717 +| 2320: 32 31 32 31 30 31 38 31 30 31 37 34 36 31 36 32 2121018101746162 +| 2336: 36 63 36 35 37 34 33 31 35 66 36 34 36 66 36 33 6c6574315f646f63 +| 2352: 37 33 0a 36 39 37 61 36 35 37 34 33 31 35 66 36 73.697a6574315f6 +| 2368: 34 36 66 36 33 37 33 36 39 37 61 36 35 30 35 34 46f6373697a65054 +| 2384: 33 35 32 34 35 34 31 35 34 34 35 32 30 35 34 34 3524541544520544 +| 2400: 31 34 32 34 63 34 35 32 30 32 37 37 34 33 31 35 1424c45202774315 +| 2416: 66 36 34 36 66 36 33 37 33 36 39 37 61 0a 36 35 f646f6373697a.65 +| 2432: 32 37 32 38 36 39 36 34 32 30 34 39 34 65 35 34 2728696420494e54 +| 2448: 34 35 34 37 34 35 35 32 32 30 35 30 35 32 34 39 4547455220505249 +| 2464: 34 64 34 31 35 32 35 39 32 30 34 62 34 35 35 39 4d415259204b4559 +| 2480: 32 63 32 30 37 33 37 61 32 30 34 32 34 63 34 66 2c20737a20424c4f +| 2496: 34 32 32 39 35 35 30 34 0a 30 36 31 37 32 31 32 42295504.0617212 +| 2512: 31 30 31 37 37 37 34 36 31 36 32 35 63 36 35 37 101777461625c657 +| 2528: 34 33 31 35 66 36 33 36 66 36 65 37 34 36 35 36 4315f636f6e74656 +| 2544: 65 37 34 37 34 33 31 35 66 36 33 36 66 36 65 37 e7474315f636f6e7 +| 2560: 34 36 35 36 65 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 4656e........... +| 2576: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 2592: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 2608: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 2624: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 2640: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 2656: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 37 34 30 .............740 +| 2672: 34 34 33 35 32 34 35 34 31 35 34 0a 34 35 32 30 44352454154.4520 +| 2688: 35 34 34 31 34 32 34 63 34 35 32 30 32 37 37 34 5441424c45202774 +| 2704: 33 31 35 66 36 33 36 66 36 65 37 34 36 35 36 65 315f636f6e74656e +| 2720: 37 34 32 37 32 38 36 39 36 34 32 30 34 39 34 65 742728696420494e +| 2736: 35 34 34 35 34 37 34 35 35 32 32 30 35 30 35 62 544547455220505b +| 2752: 30 35 30 37 31 37 32 31 32 31 30 31 38 31 30 31 0507172121018101 +| 2768: 37 34 36 31 36 32 36 63 36 35 37 34 33 31 35 66 7461626c6574315f +| 2784: 36 34 36 66 36 33 37 33 0a 36 39 37 61 36 35 37 646f6373.697a657 +| 2800: 34 33 31 35 66 36 34 36 66 36 33 37 33 36 39 37 4315f646f6373697 +| 2816: 61 36 35 30 35 34 33 35 32 34 35 34 31 35 34 34 a650543524541544 +| 2832: 35 32 30 35 34 34 31 34 32 34 63 34 35 32 30 32 5205441424c45202 +| 2848: 37 37 34 33 31 35 66 36 34 36 66 36 33 37 33 36 774315f646f63736 +| 2864: 39 37 61 0a 36 35 32 37 32 38 36 39 36 34 32 30 97a.652728696420 +| 2880: 34 39 34 65 35 34 34 35 34 37 34 35 35 32 32 30 494e544547455220 +| 2896: 35 30 35 32 34 39 34 64 34 31 35 32 35 39 32 30 5052494d41525920 +| 2912: 34 62 34 35 35 39 32 63 32 30 37 33 37 61 32 30 4b45592c20737a20 +| 2928: 34 32 34 63 34 66 34 32 32 39 35 35 30 34 0a 30 424c4f42295504.0 +| 2944: 36 31 37 32 31 32 31 30 31 37 37 37 34 36 31 36 6172121017774616 +| 2960: 32 35 63 36 35 37 34 33 31 35 66 36 33 36 66 36 25c6574315f636f6 +| 2976: 65 37 34 36 35 36 65 37 34 37 34 33 31 35 66 36 e74656e7474315f6 +| 2992: 33 36 66 36 65 37 34 36 35 36 65 0b 0b 0b 0b 0b 36f6e74656e..... +| 3008: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 3024: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 3040: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 3056: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 3072: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 3088: 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b 0b ................ +| 3104: 0b 0b 0b 37 34 30 34 34 33 35 32 34 35 34 31 35 ...7404435245415 +| 3120: 34 0a 34 35 32 30 35 34 34 31 34 32 34 63 34 35 4.45205441424c45 +| 3136: 32 30 32 37 37 34 33 31 35 66 36 33 36 66 36 65 202774315f636f6e +| 3152: 37 34 36 35 36 65 37 34 32 37 32 38 36 39 36 34 74656e7427286964 +| 3168: 32 30 34 39 34 65 35 34 34 35 34 37 34 35 35 32 20494e5445474552 +| 3184: 32 30 35 30 35 32 34 39 34 64 34 31 0a 35 32 35 205052494d41.525 +| 3200: 39 32 30 34 62 34 35 35 39 32 63 32 30 36 33 33 9204b45592c20633 +| 3216: 30 32 39 36 39 30 33 30 37 31 37 31 39 31 39 30 0296903071719190 +| 3232: 31 38 31 32 64 37 34 36 31 36 32 36 63 36 35 37 1812d7461626c657 +| 3248: 34 33 31 35 66 36 39 c3 bf c3 bf 7e c3 bf c3 89 4315f69....~.... +| 3264: 4b 52 c2 81 35 66 36 39 36 34 37 38 0a 30 33 34 KR..5f696478.034 +| 3280: 33 35 32 34 35 34 31 35 34 34 35 32 30 35 34 34 3524541544520544 +| 3296: 31 34 32 34 63 34 35 32 30 32 37 37 34 33 31 35 1424c45202774315 +| 3312: 66 36 39 36 34 37 38 32 37 32 38 37 33 36 35 36 f696478272873656 +| 3328: 37 36 39 36 34 32 63 32 30 37 34 36 35 37 32 36 769642c207465726 +| 3344: 64 32 63 32 30 37 30 0a 36 37 36 65 36 66 32 63 d2c2070.676e6f2c +| 3360: 32 30 35 30 35 32 34 39 34 64 34 31 35 32 35 39 205052494d415259 +| 3376: 32 30 34 62 34 35 35 39 32 38 37 33 36 35 36 37 204b455928736567 +| 3392: 36 39 36 34 32 63 32 30 37 34 36 35 37 32 36 64 69642c207465726d +| 3408: 32 39 32 39 32 30 35 37 34 39 35 34 34 38 34 66 292920574954484f +| 3424: 35 35 0a 35 34 32 30 35 32 34 66 35 37 34 39 34 55.5420524f57494 +| 3440: 34 35 35 30 32 30 37 31 37 31 62 31 62 30 31 38 4550207171b1b018 +| 3456: 31 30 31 37 34 36 31 36 32 36 63 36 37 37 34 33 1017461626c67743 +| 3472: 31 35 66 36 34 36 31 37 34 36 31 37 34 33 31 35 15f6461746174315 +| 3488: 66 36 34 36 31 37 34 36 31 30 32 34 33 0a 35 32 f646174610243.52 +| 3504: 34 35 34 31 35 34 34 35 32 30 35 34 34 31 34 32 4541544520544142 +| 3520: 34 63 34 35 32 30 32 37 37 34 33 31 35 66 36 34 4c45202774315f64 +| 3536: 36 31 37 34 36 31 32 37 32 38 36 39 36 34 32 30 6174612728696420 +| 3552: 34 39 34 65 35 34 34 35 34 37 34 35 35 32 32 30 494e544547455220 +| 3568: 35 30 35 32 34 39 34 64 0a 34 31 35 32 35 39 32 5052494d.4152592 +| 3584: 30 34 62 34 35 35 39 32 63 32 30 36 32 36 63 36 04b45592c20626c6 +| 3600: 66 36 33 36 62 32 30 34 32 34 63 34 66 34 32 32 f636b20424c4f422 +| 3616: 39 33 61 30 31 30 36 31 37 31 31 31 31 30 38 36 93a0106171111086 +| 3632: 33 37 34 36 31 36 32 36 63 36 35 37 34 33 31 37 37461626c6574317 +| 3648: 34 33 31 0a 34 33 35 32 34 35 34 31 35 34 34 35 431.435245415445 +| 3664: 32 30 35 36 34 39 35 32 35 34 35 35 34 31 34 63 205649525455414c +| 3680: 32 30 35 34 34 31 34 32 34 63 34 35 32 30 37 34 205441424c452074 +| 3696: 33 31 c3 94 30 35 35 35 33 34 39 34 65 34 37 32 31..05553494e472 +| 3712: 30 36 36 37 34 37 33 33 35 32 38 36 33 36 66 0a 06674733528636f. +| 3728: 33 65 37 34 36 35 36 65 37 34 32 39 30 64 30 30 3e74656e74290d00 +| 3744: 30 30 30 30 30 33 30 66 62 64 30 30 30 66 65 38 0000030fbd000fe8 +| 3760: 30 66 65 66 30 66 62 64 0a 5b 31 66 62 64 5d 32 0fef0fbd.[1fbd]2 +| 3776: 34 38 34 38 30 38 30 38 30 38 30 30 31 30 33 30 4848080808001030 +| 3792: 30 34 65 30 30 30 30 30 30 31 65 30 36 33 30 36 04e0000001e06306 +| 3808: 31 36 32 36 31 36 33 36 62 30 31 30 32 30 32 30 16261636b0102020 +| 3824: 34 30 32 36 36 37 34 30 32 30 32 30 32 30 34 30 4026674020202040 +| 3840: 34 36 65 0a 36 34 36 66 36 65 30 33 30 32 30 32 46e.646f6e030202 +| 3856: 30 34 30 61 30 37 30 35 30 31 30 33 30 30 31 30 040a070501030010 +| 3872: 30 33 30 33 30 66 30 61 30 33 30 30 32 34 30 30 03030f0a03002400 +| 3888: 30 30 30 30 30 30 30 31 30 31 30 31 30 30 30 31 0000000101010001 +| 3904: 30 31 30 31 30 31 30 61 30 30 30 30 30 30 0a 30 0101010a000000.0 +| 3920: 31 30 66 66 61 30 30 30 66 66 61 0a 5b 32 66 65 10ffa000ffa.[2fe +| 3936: 72 20 62 61 63 6b 75 70 0f ca 00 4e 81 1d 61 6c r backup...N..al +| 3952: 70 68 61 20 63 68 61 6e 6e 65 6c 20 c2 af 62 61 pha channel ..ba +| 3968: 63 6b 75 70 20 61 62 61 6e 64 6f 6e 20 74 65 73 ckup abandon tes +| 3984: 74 20 61 62 61 63 6b 20 63 68 61 6e 6e 65 62 6f t aback channebo +| 4000: 6f 6d 65 72 20 61 74 6f 6d 20 61 6c 70 68 61 20 omer atom alpha +| 4016: 61 63 74 69 76 65 09 07 03 00 19 61 74 6f 6d 69 active.....atomi +| 4032: 63 07 06 03 00 15 61 74 6b 6d 0f e0 00 0b 19 62 c.....atkm.....b +| 4048: 6f 6f 6d 65 72 09 04 03 00 19 61 63 74 69 76 65 oomer.....active +| 4064: 00 00 00 0c 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 66 21 66 74 08 01 03 00 17 61 62 61 63 6b .af!ft.....aback +| page 5 offset 16384 +| 0: 0d 0f ee 00 06 0f d6 00 0f fa 0f f4 0f e8 0f e2 ................ +| 16: 0f dc 0f d6 0f d0 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 0f ee 00 06 0e 0a 04 07 03 00 0e 01 04 06 03 00 ................ +| 4064: 0e 01 04 05 03 00 0e 1d 04 04 03 00 0e 01 00 00 ................ +| 4080: 00 06 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c19b.db +}]} {} + +do_catchsql_test 18.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 19.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c20b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ..08...........m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 0f 20 00 05 0e a0 00 0f e8 0e a0 0f bd 0f 34 .. ............4 +| 16: 0e b7 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3744: 15 0a 03 00 30 00 00 00 00 01 03 03 00 03 01 01 ....0........... +| 3760: 01 02 01 01 03 01 01 62 8c 80 80 80 80 01 04 00 .......b........ +| 3776: 81 48 00 00 00 55 06 30 61 62 61 63 6b 08 01 04 .H...U.0aback... +| 3792: 04 6e 64 6f 6e 03 01 05 01 02 05 63 74 69 76 65 .ndon......ctive +| 3808: 08 01 02 04 6c 70 68 61 08 01 02 03 74 6f 6d 08 ....lpha....tom. +| 3824: 01 01 06 62 61 63 6b 75 70 08 01 02 05 6f 6f 6d ...backup....oom +| 3840: 65 72 08 01 01 07 63 68 61 6e 6e 65 6c 08 01 01 er....channel... +| 3856: 04 74 65 73 74 08 01 04 09 0a 09 08 07 0a 09 0b .test........... +| 3872: 0f ef 00 14 2a 00 00 00 00 01 02 02 00 02 01 01 ....*........... +| 3888: 01 02 01 01 81 01 88 80 80 80 80 01 04 00 82 06 ................ +| 3904: 00 00 00 72 06 30 61 62 61 63 6b 08 02 07 04 04 ...r.0aback..... +| 3920: 6e 64 6f 6e 08 02 05 02 05 63 74 69 76 65 04 02 ndon.....ctive.. +| 3936: 02 04 02 0b 02 04 6c 70 68 61 08 04 02 0a 02 03 ......lpha...... +| 3952: 74 6f 6d 06 02 02 02 02 09 05 02 69 63 07 02 02 tom........ic... +| 3968: 01 06 62 61 63 6b 75 70 08 02 04 02 05 6f 6f 66 ..backup.....oof +| 3984: 65 72 05 02 02 04 03 6d 65 72 08 02 08 01 07 63 er.....mer.....c +| 4000: 68 61 6e 6e 65 6c 08 02 03 01 04 74 65 73 74 08 hannel.....test. +| 4016: 02 06 04 0a 09 0d 0a 0b 07 0b 0a 08 0c 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 66 04 00 22 74 00 02 22 04 04 6e 64 ck..f...t.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 06 06 00 on.............. +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 0f e0 00 06 0f b6 00 0f f6 0f ec 0f d5 0f ca ................ +| 16: 0f c1 0f b6 0f 70 0f 70 00 00 00 00 00 00 00 00 .....p.p........ +| 3952: 0f e0 00 46 81 0d 61 6c 70 68 61 20 63 68 61 6e ...F..alpha chan +| 3968: 6e 65 6c 20 62 61 63 6b 75 70 20 61 62 61 6e 64 nel backup aband +| 3984: 6f 6e 20 74 65 73 74 20 61 62 61 63 6b 20 62 6f on test aback bo +| 4000: 6f 6d 65 72 20 61 74 6f 6d 20 61 6c 70 68 61 20 omer atom alpha +| 4016: 61 63 74 69 76 65 09 07 03 00 19 61 74 6f 6d 69 active.....atomi +| 4032: 63 07 06 03 00 15 61 74 6f 6d 09 05 03 00 19 62 c.....atom.....b +| 4048: 6f 6f 66 65 72 09 04 03 00 19 61 63 74 69 76 65 oofer.....active +| 4064: 00 00 00 0c 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 0f ee 00 06 0f d6 00 0f fa 0f f4 0f e8 0f e2 ................ +| 16: 0f dc 0f d6 0f d0 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 0f ee 00 06 0e 0a 04 07 03 00 0e 01 04 06 03 00 ................ +| 4064: 0e 01 04 05 03 00 0e 01 04 04 03 00 0e 01 00 00 ................ +| 4080: 00 06 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 86 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 .eck....optimize +| end c20b.db +}]} {} + +do_catchsql_test 19.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 20.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-cf347c523f793c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 07 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 00 00 0e ee ee ee ee ee ee ee ee ...$............ +| page 3 offset 8192 +| 0: ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee ................ +| 16: ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee ee ................ +| 32: ee ee ee ee ee ee ee ee ee ee ee ee 00 10 10 10 ................ +| 48: 00 10 10 10 10 a0 00 00 00 10 ff a0 00 ff 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f4 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end crash-cf347c523f793c.db +}]} {} + +do_catchsql_test 20.1 { + SELECT * FROM t1 WHERE t1 MATCH 'abandon'; +} {1 {vtable constructor failed: t1}} + +#------------------------------------------------------------------------- +reset_db +do_test 21.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c22b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ..08...........m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 0e 8e 00 06 0e 2f 00 0f e8 0e 2f 0f bd 0f 3b ....../..../...; +| 16: 0e a5 0e 49 00 00 00 00 00 00 00 00 00 00 00 00 ...I............ +| 3616: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 ................ +| 3632: 0a 03 00 36 00 00 00 00 01 04 04 00 04 01 01 01 ...6............ +| 3648: 02 01 01 03 01 01 04 01 01 3e 90 80 80 80 80 01 .........>...... +| 3664: 04 00 81 00 00 00 00 36 06 30 62 61 63 6b 75 05 .......6.0backu. +| 3680: 02 04 05 02 04 02 05 65 61 6d 65 72 05 02 02 05 .......eamer.... +| 3696: 02 02 02 05 6f 6f 6d 65 72 05 01 05 01 02 05 75 ....oomer......u +| 3712: 6d 6d 65 72 05 02 03 05 02 03 04 0d 0d 0b 0f 27 mmer...........' +| 3728: 00 17 30 00 00 00 00 01 03 03 00 03 01 01 01 02 ..0............. +| 3744: 01 01 03 01 01 7b 8c 80 80 80 80 01 04 00 81 7a ...............z +| 3760: 00 00 00 6d 06 30 61 62 61 63 6b 0d 02 07 04 04 ...m.0aback..... +| 3776: 6e 64 6f 6e 0d 02 05 02 05 63 74 69 76 65 09 02 ndon.....ctive.. +| 3792: 02 04 02 0b 02 04 6c 70 68 61 0d 04 02 0a 02 03 ......lpha...... +| 3808: 74 6f 6d 0b 02 02 02 02 09 05 02 69 63 0c 02 02 tom........ic... +| 3824: 01 06 62 61 63 6b 75 70 0d 02 04 02 05 6f 6f 6d ..backup.....oom +| 3840: 65 72 0a 02 02 03 02 08 01 07 63 68 61 6e 6e 65 er........channe +| 3856: 6c 0d 02 03 01 04 74 65 73 74 0d 02 06 04 0a 09 l.....test...... +| 3872: 0d 0a 0b 07 0b 0d 0c 0f ef 00 14 2a 00 00 00 00 ...........*.... +| 3888: 01 02 02 00 02 01 01 01 02 01 01 7b 88 80 80 80 ................ +| 3904: 80 01 04 00 81 7a 00 00 00 6d 06 30 61 62 61 63 .....z...m.0abac +| 3920: 6b 08 02 07 04 04 6e 64 6f 6e 08 02 05 02 05 63 k.....ndon.....c +| 3936: 74 69 76 65 04 02 02 04 02 0b 02 04 6c 70 68 61 tive........lpha +| 3952: 08 04 02 0a 02 03 74 6f 6d 06 02 02 02 02 09 05 ......tom....... +| 3968: 02 69 63 07 02 02 01 06 62 61 63 6b 75 70 08 02 .ic.....backup.. +| 3984: 04 02 05 6f 6f 6d 65 72 05 02 02 03 02 08 01 07 ...oomer........ +| 4000: 63 68 61 6e 6e 65 6c 08 02 03 01 04 74 65 73 74 channel.....test +| 4016: 08 02 06 04 0a 09 0d 0a 0b 07 0b 0d 0c 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 00 02 22 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 08 0a 07 05 01 03 00 10 0d 23 00 on............#. +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 04 0f e5 00 0f fa 0f f3 0f ec 0f e5 ................ +| 4064: 00 00 00 00 00 06 04 01 0c 01 04 02 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 0f 5a 00 0d 0e ce 00 0f f6 0f ec 0f e0 0f d5 ..Z............. +| 16: 0e e7 0f c1 0f b6 0f 70 0f 65 0e ce 0f 51 0f 46 .......p.e...Q.F +| 32: 0f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3776: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 17 0a ................ +| 3792: 03 00 35 62 65 61 6d 65 72 20 62 75 6d 6d 65 72 ..5beamer bummer +| 3808: 20 62 61 63 6b 75 29 17 05 03 00 35 62 65 61 6d backu)....5beam +| 3824: 65 72 20 62 75 6d 6d 65 72 20 62 61 63 6b 75 29 er bummer backu) +| 3840: 44 0d 04 00 81 0d 61 6c 70 68 61 20 63 68 61 6e D.....alpha chan +| 3856: 6e 65 6c 20 62 61 63 6b 75 70 20 61 62 61 6e 64 nel backup aband +| 3872: 6f 6e 20 74 65 73 74 20 61 62 61 63 6b 20 62 6f on test aback bo +| 3888: 6f 6d 65 72 20 61 74 6f 6d 20 61 6c 70 68 61 20 omer atom alpha +| 3904: 61 63 74 69 76 65 09 0c 03 00 19 61 74 6f 6d 69 active.....atomi +| 3920: 63 07 0b 03 00 15 61 74 6f 6d 0f ca 00 0b 19 62 c.....atom.....b +| 3936: 6f 6f 6d 65 72 09 09 03 00 19 61 63 74 69 76 65 oomer.....active +| 3952: 44 08 04 00 81 0d 61 6c 70 68 61 20 63 68 61 6e D.....alpha chan +| 3968: 6e 65 6c 20 62 61 63 6b 75 70 20 61 62 61 6e 64 nel backup aband +| 3984: 6f 6e 20 74 65 73 74 20 61 62 61 63 6b 20 62 6f on test aback bo +| 4000: 6f 6d 65 72 20 61 74 6f 6d 20 61 6c 70 68 61 20 omer atom alpha +| 4016: 61 63 74 69 76 65 09 07 03 00 19 61 74 6f 6d 69 active.....atomi +| 4032: 63 07 06 03 00 15 61 74 6f 6d 00 00 00 0b 19 62 c.....atom.....b +| 4048: 6f 6f 6d 65 72 09 04 03 00 19 61 63 74 69 76 65 oomer.....active +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 0d 0f b2 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 0f ca 0f c4 0f be 0f b8 ................ +| 32: 0f b2 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 04 0d 03 00 0e 0a 04 0c 03 00 0e 01 04 0b ................ +| 4032: 03 00 0e 01 04 0a 03 00 0e 03 04 09 03 00 0e 01 ................ +| 4048: 04 08 03 00 0e 0a 04 07 03 00 0e 01 04 06 03 00 ................ +| 4064: 0e 01 04 05 03 00 0e 03 04 04 03 00 0e 01 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e1 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end c22b.db +}]} {} + +do_catchsql_test 21.1 { + DELETE FROM t1 WHERE t1 MATCH 'ab*ndon'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +# +reset_db +do_test 22.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c22b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 02 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 02 00 00 00 00 ................ +| 48: 00 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 ................ +| 96: 00 2e 30 38 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ..08...........m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 00 00 00 00 00 00 .....N.......... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 41 62 6c 65 74 31 5f 64 ..!!...tAblet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 75 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 uAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 0f 15 00 05 08 4e 00 0f e8 08 4e 0f bd 0f 29 ......N....N...) +| 16: 08 65 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .e.............. +| 2112: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 0a ................ +| 2128: 03 00 30 00 00 00 00 01 03 02 01 03 01 01 01 02 ..0............. +| 2144: 01 01 03 01 01 8d 28 8c 80 80 80 80 01 04 00 9a ......(......... +| 2160: 54 00 00 06 77 19 30 30 30 30 30 30 33 30 66 65 T...w.00000030fe +| 2176: 65 30 30 30 66 66 61 30 66 66 34 30 66 65 65 05 e000ffa0ff40fee. +| 2192: 02 19 02 0b 31 30 66 66 61 30 30 30 66 66 61 05 ....10ffa000ffa. +| 2208: 06 13 18 09 02 25 33 34 33 35 32 34 35 34 31 35 .....%3435245415 +| 2224: 34 34 35 32 30 35 34 34 31 34 32 34 63 34 35 32 445205441424c452 +| 2240: 30 32 37 37 34 33 31 35 66 36 39 05 02 07 02 37 02774315f69....7 +| 2256: 34 30 33 30 33 30 30 30 65 30 31 30 34 30 32 30 40303000e0104020 +| 2272: 33 30 30 30 65 30 31 30 34 30 31 30 33 30 30 30 3000e01040103000 +| 2288: 65 30 31 30 61 30 30 30 30 30 30 30 31 30 66 66 e010a000000010ff +| 2304: 34 30 30 30 66 66 34 05 02 1b 02 27 35 30 34 30 4000ff4....'5040 +| 2320: 39 30 63 30 31 30 32 30 64 30 30 30 30 30 30 30 90c01020d0000000 +| 2336: 33 30 66 65 30 30 30 30 66 66 36 30 66 65 63 30 30fe0000ff60fec0 +| 2352: 66 65 30 05 02 2c 27 02 66 30 05 02 16 02 1d 36 fe0..,'.f0.....6 +| 2368: 31 37 31 31 31 31 30 38 36 33 37 34 36 31 36 32 1711110863746162 +| 2384: 36 63 36 35 37 34 33 31 37 34 33 31 05 02 0d 02 6c6574317431.... +| 2400: 29 39 30 33 30 32 31 62 37 32 36 35 36 32 37 35 )903021b72656275 +| 2416: 36 34 36 31 37 34 36 31 37 34 33 31 35 66 36 34 6461746174315f64 +| 2432: 36 31 37 34 36 31 30 32 34 33 05 02 1f 02 43 61 6174610243....Ca +| 2448: 30 33 30 33 30 30 31 62 36 31 36 32 36 31 36 65 0303001b6162616e +| 2464: 36 34 36 66 36 65 30 38 30 32 30 33 30 30 31 37 646f6e0802030017 +| 2480: 36 31 36 32 36 31 36 36 37 34 30 38 30 31 30 33 6162616674080103 +| 2496: 30 30 31 37 36 31 36 32 36 31 36 33 36 62 30 64 0017616261636b0d +| 2512: 30 30 05 02 18 34 1d 33 36 62 30 31 30 32 30 32 00...4.36b010202 +| 2528: 30 34 30 32 36 36 37 34 30 32 30 32 30 32 30 34 0402667402020204 +| 2544: 30 34 36 65 05 02 2e 02 33 62 30 33 31 62 30 31 046e....3b031b01 +| 2560: 37 36 36 35 37 32 37 33 36 39 36 66 36 65 30 34 76657273696f6e04 +| 2576: 30 64 30 30 30 30 30 30 30 33 30 66 64 36 30 30 0d000000030fd600 +| 2592: 30 66 66 34 30 66 65 31 30 66 64 36 05 02 1d 01 0ff40fe10fd6.... +| 2608: 04 31 66 62 64 05 04 10 18 01 01 32 05 02 14 02 .1fbd......2.... +| 2624: 43 34 38 34 38 30 38 30 38 30 38 30 30 31 30 33 C484808080800103 +| 2640: 30 30 34 65 30 30 30 30 30 30 31 65 30 36 33 30 004e0000001e0630 +| 2656: 36 31 36 32 36 31 36 33 36 62 30 31 30 32 30 32 616261636b010202 +| 2672: 30 34 30 32 36 36 37 34 30 32 30 32 30 32 30 34 0402667402020204 +| 2688: 30 34 36 65 05 04 11 18 02 01 66 05 02 2a 03 02 046e......f..*.. +| 2704: 65 72 05 02 31 01 08 33 35 32 38 36 33 36 66 05 er..1..3528636f. +| 2720: 02 24 02 03 66 65 30 05 04 17 18 01 2b 34 31 35 .$..fe0.....+415 +| 2736: 32 35 39 32 30 34 62 34 35 35 39 32 63 32 30 36 259204b45592c206 +| 2752: 32 36 63 36 66 36 33 36 62 32 30 34 32 34 63 34 26c6f636b20424c4 +| 2768: 66 34 32 32 39 33 61 30 05 02 0c 2c 1f 31 30 36 f42293a0...,.106 +| 2784: 31 37 31 31 31 31 30 38 36 33 37 34 36 31 36 32 1711110863746162 +| 2800: 36 63 36 35 37 34 33 31 37 34 33 31 05 02 22 02 6c6574317431.... +| 2816: 40 33 35 32 34 35 34 31 35 34 34 35 32 30 35 36 @352454154452056 +| 2832: 34 39 35 32 35 34 37 35 34 31 34 63 32 30 35 34 49525475414c2054 +| 2848: 34 31 34 32 34 63 34 35 32 30 37 34 33 31 32 30 41424c4520743120 +| 2864: 35 35 35 33 34 39 34 65 34 37 32 30 36 36 37 34 5553494e47206674 +| 2880: 37 05 02 23 42 09 33 33 35 32 38 36 33 36 66 05 7..#B.33528636f. +| 2896: 02 0e 02 03 66 65 65 05 02 1a 01 34 35 32 34 35 ....fee....45245 +| 2912: 34 31 35 34 34 35 32 30 35 34 34 31 34 32 34 63 415445205441424c +| 2928: 34 35 32 30 32 37 37 34 33 31 35 66 36 34 36 31 45202774315f6461 +| 2944: 37 34 36 31 32 37 32 38 36 39 36 34 32 30 34 39 7461272869642049 +| 2960: 05 02 20 16 37 c3 b0 35 32 30 32 37 37 34 33 31 .. .7..520277431 +| 2976: 35 66 36 34 36 31 37 34 36 31 32 37 32 38 36 39 5f64617461272869 +| 2992: 36 34 32 30 34 39 34 65 35 34 34 35 34 37 34 35 6420494e54454745 +| 3008: 35 32 32 30 35 30 35 32 34 39 34 64 05 02 0b 03 52205052494d.... +| 3024: 48 35 39 32 30 34 62 34 35 35 39 32 63 32 30 36 H59204b45592c206 +| 3040: 33 33 30 32 39 36 39 30 33 30 30 30 31 35 37 35 3302969030001575 +| 3056: 33 31 31 39 32 36 64 37 34 36 31 36 32 36 63 36 311926d7461626c6 +| 3072: 35 37 34 33 31 35 66 36 39 36 34 37 38 37 34 33 574315f696478743 +| 3088: 31 35 66 36 39 36 34 37 38 05 02 06 02 38 34 32 15f696478....842 +| 3104: 30 35 32 34 66 35 37 34 39 34 34 35 35 30 32 30 0524f57494455020 +| 3120: 37 31 37 31 62 31 62 30 31 38 31 30 31 37 34 36 7171b1b018101746 +| 3136: 31 36 32 36 63 36 35 37 34 33 31 35 66 31 37 34 1626c6574315f174 +| 3152: 36 31 30 32 34 33 05 02 0a 02 03 66 66 34 05 02 610243.....ff4.. +| 3168: 1c 01 4a 36 34 36 66 36 65 30 33 30 32 30 32 30 ..J646f6e0302020 +| 3184: 34 30 61 30 37 30 35 30 31 30 33 30 30 31 30 30 40a0705010300100 +| 3200: 33 30 33 30 66 30 61 30 33 30 30 32 34 30 30 30 3030f0a030024000 +| 3216: 30 30 30 30 30 30 31 30 31 30 31 30 30 30 31 30 0000001010100010 +| 3232: 31 30 31 30 30 39 61 30 30 30 30 30 30 05 02 2f 101009a000000../ +| 3248: 42 09 31 30 61 30 30 30 30 30 30 05 02 28 08 43 B.10a000000..(.C +| 3264: 74 30 32 30 32 30 34 30 61 30 37 30 35 30 31 30 t0202040a0705010 +| 3280: 33 30 30 31 30 30 33 30 33 30 66 30 61 30 33 30 3001003030f0a030 +| 3296: 30 32 34 30 30 30 30 30 30 30 30 30 31 30 31 30 0240000000001010 +| 3312: 31 30 30 30 31 30 31 30 31 30 31 30 61 30 30 30 100010101010a000 +| 3328: 30 30 30 05 02 12 02 49 37 36 65 36 66 32 63 32 000....I76e6f2c2 +| 3344: 30 35 30 35 32 34 39 34 64 34 31 35 32 35 39 32 05052494d4152592 +| 3360: 30 34 62 34 35 35 39 32 38 37 33 36 35 36 37 36 04b4559287365676 +| 3376: 39 36 34 32 63 32 30 37 34 36 35 37 32 36 64 32 9642c207465726d2 +| 3392: 39 32 39 32 30 35 37 34 39 35 34 34 38 34 66 35 92920574954484f5 +| 3408: 35 05 02 09 02 4c 39 37 61 36 35 37 34 33 31 35 5....L97a6574315 +| 3424: 66 36 34 36 66 36 33 37 33 36 39 37 61 36 35 30 f646f6373697a650 +| 3440: 35 34 33 35 32 34 35 34 31 35 34 34 35 32 30 35 5435245415445205 +| 3456: 34 38 36 39 36 34 32 30 34 39 34 65 35 34 34 35 48696420494e5445 +| 3472: 34 37 34 35 35 32 32 30 35 30 35 32 34 39 34 34 4745522050524944 +| 3488: 64 31 05 02 05 02 27 65 37 34 36 35 36 65 37 34 d1....'e74656e74 +| 3504: 32 39 30 64 30 30 30 30 30 30 30 33 30 66 62 64 290d000000030fbd +| 3520: 30 30 30 62 65 38 30 66 65 66 30 66 62 64 05 02 000be80fef0fbd.. +| 3536: 0f 1e 0b 66 65 38 30 66 65 66 30 66 62 64 05 02 ...fe80fef0fbd.. +| 3552: 25 02 03 66 64 36 05 02 1e 01 4a 37 36 32 39 32 %..fd6....J76292 +| 3568: 30 35 37 34 39 35 34 34 38 34 66 35 35 35 34 32 0574954484f55542 +| 3584: 30 35 32 34 66 35 37 34 39 34 34 35 62 30 35 30 0524f5749445b050 +| 3600: 37 31 37 32 31 32 31 30 31 38 31 30 31 37 34 36 7172121018101746 +| 3616: 31 36 32 36 63 36 35 37 34 33 31 35 66 36 34 36 1626c6574315f646 +| 3632: 66 36 33 37 33 05 02 04 02 21 38 32 37 32 38 37 f6373....!827287 +| 3648: 33 36 35 36 37 36 39 36 34 32 63 32 30 37 34 36 3656769642c20746 +| 3664: 35 37 32 36 64 32 63 32 30 37 30 05 02 08 01 01 5726d2c2070..... +| 3680: 61 05 02 2b 01 06 62 61 63 6b 75 70 05 02 32 02 a..+..backup..2. +| 3696: 05 65 61 6d 65 72 05 02 02 02 05 6f 6f 6d 65 72 .eamer.....oomer +| 3712: 05 01 02 40 75 6d 6d 32 34 63 34 35 32 30 32 37 ...@umm24c452027 +| 3728: 37 34 33 31 35 66 36 33 36 66 36 65 36 36 36 39 74315f636f6e6669 +| 3744: 36 37 32 37 32 38 36 62 32 30 35 30 35 32 34 39 6727286b20505249 +| 3760: 34 64 34 31 35 32 35 39 32 30 34 62 34 35 35 39 4d415259204b4559 +| 3776: 32 63 32 30 05 02 03 01 15 65 35 34 34 35 34 37 2c20.....e544547 +| 3792: 34 35 35 32 32 30 35 30 35 32 34 39 34 64 05 02 4552205052494d.. +| 3808: 21 01 02 66 61 05 02 15 04 1d 12 2a 3c 2c 07 22 !..fa......*<,.. +| 3824: 2e 48 22 38 0a 06 49 06 07 0d 09 30 24 45 0e 08 .H.8..I....0$E.. +| 3840: 39 3c 4d 3d 08 4f 0e 48 4e 51 2c 10 08 4f 26 06 9.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 b2 04 55 85 44 54 e5 34 MIT LOAD..U.DT.4 +| 3216: 94 f4 e5 84 e4 f4 34 15 34 51 e1 f0 50 03 30 f1 ......4.4Q..P.0. +| 3232: 74 f4 d4 95 42 04 c4 f4 14 42 04 55 85 44 54 e5 t...B....B.U.DT. +| 3248: 34 94 f4 e5 85 25 45 24 94 d1 f1 e0 50 03 30 f1 4....%E$....P.0. +| 3264: 94 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 03 03 ......T..%..S... +| 3280: 03 03 03 05 84 24 94 e4 15 25 91 f1 d0 50 03 30 .....$...%...P.0 +| 3296: f1 94 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 03 .......T..%..S.. +| 3312: 03 03 03 03 05 84 e4 f4 34 15 34 51 e1 c0 50 03 ........4.4Q..P. +| 3328: 30 f1 74 d4 15 82 04 d4 54 d4 f5 25 93 d3 53 03 0.t.....T..%..S. +| 3344: 03 03 03 03 03 05 85 25 45 24 94 d1 81 b0 50 02 .......%E$....P. +| 3360: 50 f1 94 54 e4 14 24 c4 52 05 25 45 24 54 55 84 P..T..$.R.%E$TU. +| 3376: 24 94 e4 15 25 91 81 a0 50 02 50 f1 94 54 e4 14 $...%...P.P..T.. +| 3392: 24 c4 52 05 25 45 24 54 55 84 e4 f4 34 15 34 51 $.R.%E$TU...4.4Q +| 3408: 71 90 50 02 50 f1 74 54 e4 14 24 c4 52 05 25 45 q.P.P.tT..$.R.%E +| 3424: 24 54 55 85 25 45 24 94 d1 a1 80 50 02 90 f1 94 $TU.%E$....P.... +| 3440: 54 e4 14 24 c4 52 04 d4 54 d5 35 95 33 55 84 24 T..$.R..T.5.3U.$ +| 3456: 94 e4 15 25 91 a1 70 50 02 90 f1 94 54 e4 14 24 ...%..pP....T..$ +| 3472: c4 52 04 d4 54 d5 35 95 33 55 84 e4 f4 34 15 34 .R..T.5.3U...4.4 +| 3488: 51 91 60 50 02 90 f1 74 54 e4 14 24 c4 52 04 d4 Q.`P...tT..$.R.. +| 3504: 54 d5 35 95 33 55 85 25 45 24 94 d1 81 50 50 02 T.5.3U.%E$...PP. +| 3520: 50 f1 94 54 e4 14 24 c4 52 04 a5 34 f4 e3 15 84 P..T..$.R..4.... +| 3536: 24 94 e4 15 25 91 81 40 50 02 50 f1 94 54 e4 14 $...%..@P.P..T.. +| 3552: 24 c4 52 04 a5 34 f4 e3 15 84 e4 f4 34 15 34 51 $.R..4......4.4Q +| 3568: 71 30 50 02 50 f1 74 54 e4 14 24 c4 52 04 a5 34 q0P.P.tT..$.R..4 +| 3584: f4 e3 15 85 25 45 24 94 d1 a1 20 50 02 90 f1 94 ....%E$... P.... +| 3600: 54 e4 14 24 c4 52 04 74 54 f5 04 f4 c5 95 84 24 T..$.R.tT......$ +| 3616: 94 e4 15 25 91 a1 10 50 02 90 f1 94 54 e4 14 24 ...%...P....T..$ +| 3632: c4 52 04 74 54 f5 04 f4 c5 95 84 e4 f4 34 15 34 .R.tT........4.4 +| 3648: 51 91 00 50 02 90 f1 74 54 e4 14 24 c4 52 04 74 Q..P...tT..$.R.t +| 3664: 54 f5 04 f4 c5 95 85 25 45 24 94 d1 70 f0 50 02 T......%E$..p.P. +| 3680: 30 f1 94 54 e4 14 24 c5 20 46 54 53 35 58 42 49 0..T..$. FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 97 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 02 02 50 08 5f 17 44 45 42 55 47 CASE...P._.DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-b87dfef02880fe.db +}]} {} + +do_catchsql_test 24.1 { + UPDATE t1 SET b=quote(zeroblob(200)) WHERE a MATCH 'thread*'; +} {1 {database disk image is malformed}} + +do_catchsql_test 24.2 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 25.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-e3b1b19e4d4bcc.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 06 00 00 00 00 .....@ ........ +| 32: 00 00 00 00 00 00 00 06 00 00 00 04 00 00 00 00 ................ +| 48: 03 20 54 35 24 54 15 44 52 04 94 e4 44 55 82 07 . T5$T.DR...DU.. +| 64: 43 27 a2 04 f4 e2 07 43 22 87 a2 95 30 30 71 71 C'.....C....00qq +| 80: 11 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 .SQLite format 3 +| 96: 00 10 00 01 0d 00 00 00 07 0d d2 00 0f c4 0f 6d ...............m +| 112: 0f 02 0e ab 0e 4e 0d f6 0d d2 03 30 01 00 00 10 .....N.....0.... +| 128: 10 04 02 02 00 00 00 00 00 00 00 00 30 00 00 00 ............0... +| 144: 00 00 00 00 00 00 00 00 20 00 00 00 40 00 00 00 ........ ...@... +| 3536: 00 00 22 07 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3552: 32 74 32 07 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3568: 20 74 32 28 78 29 56 06 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3584: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3600: 6f 6e 66 69 67 06 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3616: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3632: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3648: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 05 WITHOUT ROWID[. +| 3664: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3680: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3696: 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3712: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3728: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3744: 59 2c 20 73 7a 20 42 4c 4f 42 29 55 04 06 17 21 Y, sz BLOB)U...! +| 3760: 21 01 77 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 !.wtablet1_conte +| 3776: 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 04 43 52 45 ntt1_content.CRE +| 3792: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f ATE TABLE 't1_co +| 3808: 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 45 ntent'(id INTEGE +| 3824: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 63 R PRIMARY KEY, c +| 3840: 30 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 0)i.......-table +| 3856: 74 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 t1_idxt1_idx.CRE +| 3872: 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 ATE TABLE 't1_id +| 3888: 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 x'(segid, term, +| 3904: 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 pgno, PRIMARY KE +| 3920: 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 Y(segid, term)) +| 3936: 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 WITHOUT ROWIDU.. +| 3952: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 ......tablet1_da +| 3968: 74 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 tat1_data.CREATE +| 3984: 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 TABLE 't1_data' +| 4000: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 d9 44 (id INTEGER PR.D +| 4016: 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 ARY KEY, block B +| 4032: 4c 4f 42 29 3a 01 06 17 11 11 08 63 74 61 62 6c LOB):......ctabl +| 4048: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4064: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4080: 4e 47 20 66 74 73 35 28 63 6f 6e 74 65 6e 74 29 NG fts5(content) +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f bd 00 0f e8 0f ef 0f bd 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 24 84 80 .............$.. +| 4032: 80 80 80 01 03 00 4e 00 00 00 1e 06 30 61 62 61 ......N.....0aba +| 4048: 63 6b 01 02 02 04 02 66 74 02 02 02 04 04 6e 64 ck.....ft.....nd +| 4064: 6f 6e 03 02 02 04 0a 07 05 01 03 00 10 03 03 0f on.............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f e0 fe 00 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 00 03 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f ee 00 0f fa 0f f4 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 03 ................ +| 4080: 03 00 0e 01 04 02 03 00 0e 01 04 01 03 00 0e 01 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 01 fe 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 09 03 02 1b 72 65 62 75 69 6c ..........rebuil +| 4064: 64 11 02 02 2b 69 6e 74 65 67 72 69 74 79 2d 63 d...+integrity-c +| 4080: 68 65 63 6b 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 heck....optimize +| end crash-e3b1b19e4d4bcc.db +}]} {} + +do_catchsql_test 25.1 { + INSERT INTO t1(t1) VALUES('rebuild'); +} {1 {database disk image is malformed}} + +do_execsql_test 25.2 { + PRAGMA page_size=512; +} + +#-------------------------------------------------------------------------- +reset_db +do_test 26.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename c30b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ..08...........6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 0c 0f 00 05 09 fe 00 0f e6 09 fe 0c 94 0c 23 ...............# +| 16: 0a 15 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 2544: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 15 0a ................ +| 2560: 03 00 30 00 00 00 00 01 03 03 00 03 01 01 01 02 ..0............. +| 2576: 01 01 03 01 01 83 72 8c 80 80 80 80 01 04 00 87 ......r......... +| 2592: 68 00 00 01 e4 02 30 30 03 03 06 02 83 0f 30 30 h.....00......00 +| 2608: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2624: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2640: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2656: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2672: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2688: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2704: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2720: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2736: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2752: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2768: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2784: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2800: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2816: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2832: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2848: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2864: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2880: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2896: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2912: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2928: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2944: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2960: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2976: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2992: 30 30 30 30 30 30 30 30 30 30 30 30 30 03 06 01 0000000000000... +| 3008: 01 03 01 08 32 30 31 36 30 36 30 39 03 03 07 01 ....20160609.... +| 3024: 01 34 03 03 05 01 01 35 03 03 04 01 06 62 69 6e .4.....5.....bin +| 3040: 61 72 79 03 07 01 02 02 01 08 63 6f 6d 70 69 6c ary.......compil +| 3056: 65 72 03 03 02 01 03 67 63 63 03 03 03 01 01 78 er.....gcc.....x +| 3072: 03 07 01 01 02 04 06 83 17 0d 06 06 0d 0d 08 0f ................ +| 3088: ef 00 14 2a 00 00 00 00 01 02 02 00 02 01 01 01 ...*............ +| 3104: 02 01 01 6a 88 80 80 80 80 01 04 00 81 58 00 00 ...j.........X.. +| 3120: 00 5f 07 30 62 69 6e 61 72 79 0c 01 03 01 01 06 ._.0binary...... +| 3136: 65 6e 61 62 6c 65 0a 01 01 01 01 01 01 01 01 01 enable.......... +| 3152: 01 01 01 04 66 74 73 34 0a 01 01 01 01 01 04 01 ....fts4........ +| 3168: 35 0d 01 01 01 01 01 01 06 6e 6f 63 61 73 65 0b 5........nocase. +| 3184: 01 03 01 01 05 72 74 72 69 6d 0a 01 03 01 01 01 .....rtrim...... +| 3200: 78 0a 01 01 01 01 01 01 01 01 01 01 01 04 0c 14 x............... +| 3216: 0c 09 0c 0b 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 03 57 34 56 ..threadsafe.W4V +| 3840: 94 64 91 46 85 84 04 76 74 61 62 07 02 04 01 02 .d.F...vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 10 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 1e 4e 1f 1e 00 D..@........N... +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 0e 5b 00 1e 0a 4d 00 0f d8 0f af 0a 4d 0f 74 ..[...M......M.t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e 40 0e 24 0e 08 .a.N./.....@.$.. +| 32: 0d ef 0d d5 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 ...........h.O.5 +| 48: 0d 1b 0c fb 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e ...........x.W.> +| 64: 0c 24 0c 0a 0c 0a 0c 0a 0c 0a 0c 0a 0c 0a 0c 0a .$.............. +| 2624: 00 00 00 00 00 00 00 00 00 00 00 00 00 83 3a 03 ..............:. +| 2640: 06 00 43 86 33 19 43 4f 4d 50 49 4c 45 52 3d 67 ..C.3.COMPILER=g +| 2656: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 2672: 39 58 27 30 30 30 30 30 30 30 30 30 30 30 30 30 9X'0000000000000 +| 2688: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2704: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2720: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2736: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2752: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2768: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2784: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2800: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2816: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2832: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2848: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2864: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2880: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2896: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2912: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2928: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2944: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2960: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2976: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 2992: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3008: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3024: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3040: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3056: 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 0000000000000000 +| 3072: 30 30 30 27 42 49 4e 41 52 59 18 24 05 00 25 0f 000'BINARY.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 42 60 2d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 B`-EMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 0f 86 00 94 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 00 00 00 7b 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 00 00 00 E FTS5XNOCASE... +| 3728: 62 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 b#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 00 00 00 4a 23 0f 19 45 4e 41 42 RTRIM...J#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 00 00 LE FTS4XBINARY.. +| 3776: 00 31 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 .1#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 00 00 00 18 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 24 15 48 4e 4f 43 41 53 45 1d TAT VT$.HNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 00 00 00 29 43 0f 19 43 4f 4d XRTRIM...)C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 0f 88 00 1e 0e e0 00 0f f8 0f f0 0f b0 0f e0 ................ +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f 80 0f 78 0f 70 .............x.p +| 32: 0f 68 0f 60 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 .h.`.X.P.H.@.8.0 +| 48: 0f 28 0f 20 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 .(. ............ +| 64: 0e e8 0e e0 0e e0 0e e0 0e e0 0e e0 0e e0 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 0f e8 00 28 12 02 01 01 ...........(.... +| 3984: 00 00 00 28 12 02 01 01 00 00 00 20 12 02 01 01 ...(....... .... +| 4000: 00 00 00 18 12 02 01 01 00 00 00 10 12 02 01 01 ................ +| 4016: 06 03 03 00 12 06 02 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 00 00 00 08 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end c30b.db +}]} {} + +do_catchsql_test 26.1 { + BEGIN; + INSERT INTO t1(t1) VALUES('rebuild'); + INSERT INTO t1(t1) VALUES('integrity-check'); + COMMIT; +} {0 {}} + +#-------------------------------------------------------------------------- +reset_db +do_test 27.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename timeout-2ca5b0658c98.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 20 01 02 02 02 01 02 02 01 06 64 iler. .........d +| 3408: 62 73 7c cc cc cc cc cc cc cc cc cc cc cc cc cc bs|............. +| 3424: cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc ................ +| 3440: cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc cc ................ +| 3456: cc cc cc cc cc cc c4 61 74 07 02 03 01 02 03 01 .......at....... +| 3472: 02 03 02 04 65 62 75 67 04 02 02 01 02 02 01 02 ....ebug........ +| 3488: 02 01 06 65 6e 61 62 6c 65 07 02 02 01 02 02 01 ...enable....... +| 3504: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3520: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3536: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 05 23 ...............# +| 3552: d6 76 36 32 d3 52 e3 42 e3 02 03 23 03 13 63 03 .v62.R.B...#..c. +| 3568: 63 03 95 84 e4 f4 34 15 34 52 60 10 50 04 30 f1 c.....4.4R`.P.0. +| 3584: 74 34 f4 d5 04 94 c4 55 23 d6 76 36 32 d3 52 e3 t4.....U#.v62.R. +| 3600: 42 e3 02 03 23 03 13 63 03 63 03 95 85 25 45 24 B...#..c.c...%E$ +| 3616: 94 d0 d0 00 00 02 40 ee 00 00 ff 80 ff 00 fe 80 ......@......... +| 3632: fe 00 fd 80 fd 00 fc 80 fc 00 fb 80 fb 00 fa 80 ................ +| 3648: fa 00 f9 80 f9 00 f8 80 f8 00 f7 80 f7 00 f6 80 ................ +| 3664: f6 00 f5 80 f5 00 f4 80 f4 00 f8 0f 30 0f 28 0f ............0.(. +| 3680: 20 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e ............... +| 3696: e0 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 5f e8 54 45 4e OMIT LOAD E_.TEN +| 3248: 53 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f SIONXRTRIM....3. +| 3264: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 31 81 .MAX MEMORY=501. +| 3280: 40 50 02 50 f1 94 54 e4 14 24 c4 52 04 a5 35 f4 @P.P..T..$.R..5. +| 3296: e3 15 84 e4 f4 34 15 34 51 71 30 50 02 50 f1 74 .....4.4Qq0P.P.t +| 3312: 54 e4 14 24 c4 52 04 a5 34 f4 e3 15 85 25 45 24 T..$.R..4....%E$ +| 3328: 94 d1 a1 20 50 02 90 f1 94 54 e4 14 24 c4 52 04 ... P....T..$.R. +| 3344: 74 54 f5 04 f4 c5 95 84 24 94 e4 15 25 91 a1 10 tT......$...%... +| 3360: 50 02 90 f1 94 54 e4 14 24 c4 52 04 74 54 f5 04 P....T..$.R.tT.. +| 3376: f4 c5 95 84 e4 f4 34 15 34 51 91 00 50 02 90 f1 ......4.4Q..P... +| 3392: 74 54 e4 14 24 c4 52 04 74 54 f5 04 f4 c5 95 85 tT..$.R.tT...... +| 3408: 25 45 24 94 d1 70 f0 50 02 30 f1 94 54 e4 14 24 %E$..p.P.0..T..$ +| 3424: c4 52 04 65 45 33 55 84 24 94 e4 15 25 91 70 e0 .R.eE3U.$...%.p. +| 3440: 50 02 30 f1 94 54 e4 14 24 c4 52 04 65 45 33 55 P.0..T..$.R.eE3U +| 3456: 84 e4 f4 34 15 34 51 60 d0 50 02 30 f1 74 54 e4 ...4.4Q`.P.0.tT. +| 3472: 14 24 c4 52 04 65 45 33 55 85 25 45 24 94 d1 70 .$.R.eE3U.%E$..p +| 3488: c0 50 02 30 f1 94 54 e4 14 24 c4 52 04 65 45 33 .P.0..T..$.R.eE3 +| 3504: 45 84 24 94 e4 15 25 91 70 b0 50 02 30 f1 94 54 E.$...%.p.P.0..T +| 3520: e4 14 24 c4 52 04 65 45 33 45 84 e4 f4 34 15 34 ..$.R.eE3E...4.4 +| 3536: 51 60 a0 50 02 30 f1 74 54 e4 14 24 c4 52 04 65 Q`.P.0.tT..$.R.e +| 3552: 45 33 45 85 25 45 24 94 d1 e0 90 50 03 10 f1 94 E3E.%E$....P.... +| 3568: 54 e4 42 4c 45 20 44 42 53 54 41 54 20 56 54 41 T.BLE DBSTAT VTA +| 3584: 42 58 42 49 4e 41 52 59 1e 08 05 00 31 0f 19 45 BXBINARY....1..E +| 3600: e4 14 24 c4 52 04 44 25 35 44 15 42 05 65 42 41 ..$.R.D%5D.B.eBA +| 3616: 54 84 e4 f4 34 15 34 51 d0 70 50 03 10 f1 74 54 T...4.4Q.pP...tT +| 3632: e4 14 24 c4 52 04 44 25 35 44 15 42 05 65 44 14 ..$.R.D%5D.B.eD. +| 3648: 25 85 25 45 24 94 d1 10 60 50 01 70 f1 94 44 54 %.%E$...`P.p..DT +| 3664: 25 54 75 84 24 94 e4 15 25 91 10 50 50 01 70 f1 %Tu.$...%..PP.p. +| 3680: 94 44 54 25 54 75 84 e4 f4 34 15 34 51 00 40 50 .DT%Tu...4.4Q.@P +| 3696: 01 70 f1 74 44 54 25 54 75 85 25 45 24 94 d2 70 .p.tDT%Tu.%E$..p +| 3712: 30 50 04 30 f1 94 34 f4 d5 04 94 c4 55 23 d6 76 0P.0..4.....U#.v +| 3728: 36 32 d3 52 e3 42 e3 02 03 23 03 13 63 03 63 03 62.R.B...#..c.c. +| 3744: 95 84 24 94 e4 15 25 92 70 20 50 04 30 f1 94 34 ..$...%.p P.0..4 +| 3760: f4 d5 04 94 c4 53 30 01 00 00 10 10 04 02 02 00 .....S0......... +| 3776: 00 00 00 00 00 00 00 80 00 00 00 20 00 00 00 10 ........... .... +| 3792: 00 00 00 90 00 00 00 40 00 00 00 00 00 00 00 00 .......@........ +| page 6 offset 20480 +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end timeout-2ca5b0658c98.db +}]} {} + +do_catchsql_test 27.1 { + DELETE FROM t1 WHERE a MATCH 'fts*'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 28.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-e2d47e0624a42c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 20 ....c.....g.... +| 4048: 10 16 80 10 60 10 20 30 10 16 90 10 60 10 20 40 ....`. 0....`. @ +| 4064: 40 60 60 60 80 80 70 10 30 01 40 30 90 00 90 00 @```..p.0.@0.... +| 4080: 00 01 12 40 00 00 00 00 10 10 10 00 10 10 10 10 ...@............ +| page 3 offset 8192 +| 0: a0 00 00 00 30 fe c0 00 ff a0 ff 30 fe 00 00 00 ....0......0.... +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 01 01 68 .d...e...f.....h +| 4048: 01 01 01 01 01 69 01 01 01 04 06 06 06 04 04 04 .....i.......... +| 4064: 06 06 07 01 03 00 14 03 09 09 09 0f 0a 03 00 24 ...............$ +| 4080: 00 00 00 00 01 01 01 00 01 01 01 01 0a 00 00 00 ................ +| page 8 offset 28672 +| 0: 01 0f fa 00 0f fa 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 1f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-e2d47e0624a42c.db +}]} {} + +do_catchsql_test 28.1 { + SELECT count( fts5_decode(id, block) ) FROM t2_data; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 29.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-e114c036e13dde.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 08 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 06 0d b6 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d b6 00 00 00 00 00 00 ...k............ +| 3504: 00 00 00 00 00 00 56 07 06 17 1f 1f 01 7d 74 61 ......V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c af 00 0f e6 0f ef 0c af 00 00 ................ +| 3232: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 86 ................ +| 3248: 2f 84 80 80 80 80 01 04 00 8c 62 00 00 03 12 02 /.........b..... +| 3264: 30 30 01 04 05 03 01 04 05 03 01 04 05 03 1f 02 00.............. +| 3280: 03 01 02 03 01 02 03 01 08 35 30 30 30 30 30 30 .........5000000 +| 3296: 30 1c 02 04 01 02 04 01 02 04 01 01 36 01 02 04 0...........6... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 05 63 6c 61 6e ............clan +| 3392: 67 01 02 03 01 02 03 01 02 03 02 07 6f 6d 70 69 g...........ompi +| 3408: 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 62 ler...........db +| 3424: 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 65 stat...........e +| 3440: 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 6e bug...........en +| 3456: 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 02 able............ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3520: 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 04 .....xtension... +| 3536: 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 03 ........fts4.... +| 3552: 01 02 01 02 03 04 01 35 0d 02 03 01 02 03 01 02 .......5........ +| 3568: 03 01 07 67 65 6f 70 6f 6c 79 10 02 03 01 02 03 ...geopoly...... +| 3584: 01 02 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 .....json1...... +| 3600: 01 02 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 .....load....... +| 3616: 02 03 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 ....max......... +| 3632: 02 05 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 ..emory......... +| 3648: 04 04 73 79 73 35 16 02 03 01 02 03 01 02 03 01 ..sys5.......... +| 3664: 06 6e 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 .nocase......... +| 3680: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3696: 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 ................ +| 3712: 06 01 02 02 03 06 01 02 02 03 06 01 12 02 03 06 ................ +| 3728: 01 02 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 .....omit....... +| 3744: 02 02 01 05 72 74 72 65 65 19 02 03 01 02 03 01 ....rtree....... +| 3760: 02 03 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 ....im.......... +| 3776: 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 ................ +| 3792: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3808: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3824: 02 02 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 ....threadsafe.. +| 3840: 02 01 02 02 01 02 02 01 04 76 74 61 62 07 02 04 .........vtab... +| 3856: 01 02 04 01 02 04 01 01 78 01 06 01 01 02 01 06 ........x....... +| 3872: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3888: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3904: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3920: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3936: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3952: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3968: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3984: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 4000: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 4016: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4032: 01 01 02 01 06 01 01 02 01 06 01 01 02 04 18 13 ................ +| 4048: 0c 44 10 12 11 0f 47 13 0f 0c 12 10 0f 0e 10 0f .D....G......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 57 24 24 0f D..@.......$W$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 1f 00 0f df 0f bd 0f 9b 0f 89 ....$........... +| 16: 0f 76 0f 63 0f 44 0f 24 0f 04 0e ec 0e d3 0e ba .v.c.D.$........ +| 32: 0e a2 0e 89 0e 70 e5 50 e3 90 e1 d0 e0 40 de a0 .....p.P.....@.. +| 48: dd 00 db 50 d9 90 d7 ea ca ea be d0 d6 40 d4 a0 ...P.........@.. +| 64: d3 00 d1 00 ce f0 cc e0 ca e0 c8 d0 c6 c0 c5 30 ...............0 +| 80: c3 90 c1 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3088: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 18 ................ +| 3104: 24 05 00 25 0f 19 54 48 52 45 41 44 53 41 46 45 $..%..THREADSAFE +| 3120: 3d 30 58 42 49 4e 41 52 59 18 23 05 00 25 0f 19 =0XBINARY.#..%.. +| 3136: 54 48 52 45 41 44 53 41 46 45 3d 30 58 4e 4f 43 THREADSAFE=0XNOC +| 3152: 41 53 45 17 22 05 00 25 0f 17 54 48 52 45 41 44 ASE....%..THREAD +| 3168: 53 41 46 45 3d 30 05 00 33 0f 19 4f 4d 49 54 20 SAFE=0..3..OMIT +| 3184: 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 58 42 LOAD EXTENSIONXB +| 3200: 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f 4d 49 54 INARY. ..3..OMIT +| 3216: 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 58 LOAD EXTENSIONX +| 3232: 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 4f 4d 49 NOCASE....3..OMI +| 3248: 54 20 4c f4 14 42 04 55 85 44 54 e5 34 94 f4 e5 T L..B.U.DT.4... +| 3264: 85 25 45 24 94 d1 f1 e0 50 03 30 f1 94 d4 15 82 .%E$....P.0..... +| 3280: 04 d4 54 d4 f5 25 93 d3 53 03 03 03 03 03 03 05 ..T..%..S....... +| 3296: 84 24 94 e4 15 25 91 f1 d0 50 03 30 f1 94 d4 15 .$...%...P.0.... +| 3312: 82 04 d4 54 d4 f5 25 93 d3 53 03 03 03 03 03 03 ...T..%..S...... +| 3328: 05 84 e4 f4 34 15 34 51 e1 c0 50 03 30 f1 74 d4 ....4.4Q..P.0.t. +| 3344: 15 82 04 d4 54 d4 f2 90 f1 74 54 e4 14 24 c4 52 ....T....tT..$.R +| 3360: 04 74 54 f5 04 f4 c5 95 85 25 45 24 94 d1 70 f0 .tT......%E$..p. +| 3376: 50 02 30 f1 94 54 e4 14 24 c4 52 04 65 45 33 55 P.0..T..$.R.eE3U +| 3392: 84 24 94 e4 15 25 91 70 e0 50 02 30 f1 94 54 e4 .$...%.p.P.0..T. +| 3408: 14 24 c4 52 04 65 45 33 55 84 e4 f4 34 15 34 51 .$.R.eE3U...4.4Q +| 3424: 60 d0 50 02 30 f1 74 54 e4 14 24 c4 52 04 65 45 `.P.0.tT..$.R.eE +| 3440: 33 55 85 25 45 24 94 d1 70 c0 50 02 30 f1 94 54 3U.%E$..p.P.0..T +| 3456: e4 14 24 c4 52 04 65 45 33 45 84 24 94 e4 15 25 ..$.R.eE3E.$...% +| 3472: 91 70 b0 50 02 30 f1 94 54 e4 14 24 c4 52 04 65 .p.P.0..T..$.R.e +| 3488: 45 33 45 84 e4 f4 34 15 34 51 60 a0 74 54 e4 14 E3E...4.4Q`.tT.. +| 3504: 24 c4 52 04 65 45 33 45 85 25 45 24 94 d1 e0 90 $.R.eE3E.%E$.... +| 3520: 50 03 10 f1 94 54 e4 14 24 c4 52 04 44 25 35 44 P....T..$.R.D%5D +| 3536: 15 42 05 65 44 14 25 84 24 94 e4 15 25 91 e0 80 .B.eD.%.$...%... +| 3552: 50 03 10 f1 94 54 e4 14 24 c4 52 04 44 25 35 44 P....T..$.R.D%5D +| 3568: 15 42 05 65 44 14 25 84 e4 f4 34 15 34 51 d0 70 .B.eD.%...4.4Q.p +| 3584: 50 03 10 f1 74 54 e4 14 24 c4 52 04 44 25 35 44 P...tT..$.R.D%5D +| 3600: 15 42 05 65 44 14 25 85 25 45 24 94 d1 10 60 50 .B.eD.%.%E$...`P +| 3616: 01 70 f1 94 44 54 25 54 75 84 24 94 e4 15 25 91 .p..DT%Tu.$...%. +| 3632: 10 50 50 01 70 f1 94 44 54 25 54 75 84 e4 f4 34 .PP.p..DT%Tu...4 +| 3648: 15 34 51 00 40 50 01 70 f1 74 44 54 25 54 75 85 .4Q.@P.p.tDT%Tu. +| 3664: 25 45 24 94 d2 00 30 50 03 50 f1 94 34 f4 d5 04 %E$...0P.P..4... +| 3680: 94 c4 55 23 d6 36 c6 16 e6 72 d3 62 e3 02 e3 05 ..U#.6...r.b.... +| 3696: 84 24 94 e4 15 25 92 00 20 50 03 50 f1 94 34 f4 .$...%.. P.P..4. +| 3712: d5 04 94 c4 55 23 d6 36 c6 16 e6 72 d3 62 e3 02 ....U#.6...r.b.. +| 3728: e3 05 84 e4 f4 34 15 34 51 f0 10 50 03 50 f1 74 .....4.4Q..P.P.t +| 3744: 34 f4 d5 04 94 c4 55 23 d6 36 c6 16 e6 72 d3 62 4.....U#.6...r.b +| 3760: e3 02 e3 05 85 25 45 24 94 d0 d0 00 00 02 40 ee .....%E$......@. +| 3776: 00 00 ff 80 ff 00 fe 80 fe 00 fd 80 fd 00 fc 80 ................ +| 3792: fc 00 fb 80 fb 00 fa 80 fa 00 f9 80 f9 00 f8 80 ................ +| 3808: f8 00 f7 80 f7 00 f6 80 f6 00 f5 80 f5 00 f4 80 ................ +| 3824: f4 00 f3 80 f3 00 f2 80 f2 00 f1 80 f1 00 f0 80 ................ +| 3840: f0 00 ef 80 ef 00 ee 80 ee 00 00 00 00 00 00 00 ................ +| page 6 offset 20480 +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 05 01 01 ................ +| 4080: 06 02 03 00 12 05 01 01 06 01 03 00 12 05 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-e114c036e13dde.db +}]} {} + +do_catchsql_test 29.1 { + CREATE VIRTUAL TABLE t3 USING fts5vocab('t1','col'); +} {0 {}} +do_catchsql_test 29.2 { + SELECT rowid, quote(term), * FROM t3 WHERE term=='nocase'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 30.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-eef41e30b388a0.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 00 00 66 46 08 08 0f ef 00 14 2a 00 00 00 ....fF......*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 02 ....c.....g..... +| 4048: 01 01 68 01 06 01 02 03 01 01 69 01 06 01 02 04 ..h.......i..... +| 4064: 04 06 06 06 08 08 07 01 03 00 14 03 09 00 09 00 ................ +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 52 06 66 72 06 82 06 90 .a b cd R.fr.... +| page 5 offset 16384 +| 0: d0 00 00 00 30 fe 80 00 ff 80 ff 00 fe 00 00 00 ....0........... +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 04 04 06 06 07 01 03 00 14 03 09 09 09 0f ................ +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-eef41e30b388a0.db +}]} {} + +do_catchsql_test 30.1 { + SELECT fts5_decode(id, block) FROM t1_data; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 31.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 8192 pagesize 4096 filename crash-7629f35f11d48e.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 02 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 01 0f c7 00 0f c7 00 00 ................ +| 4032: 00 00 00 00 00 00 00 37 01 06 17 15 15 01 53 74 .......7......St +| 4048: 61 62 6c 65 64 75 61 6c 64 75 61 6c 02 43 52 45 abledualdual.CRE +| 4064: 41 54 45 20 54 41 42 4c 45 20 64 75 61 6c 28 64 ATE TABLE dual(d +| 4080: 75 6d 6d 79 20 76 61 72 28 31 29 29 0d 00 00 00 ummy var(1)).... +| page 2 offset 4096 +| 0: 01 0f fb 00 0f fb 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 03 01 02 0f 58 ...............X +| end crash-7629f35f11d48e.db +}]} {} + +do_execsql_test 31.1 { + CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<72) + INSERT INTO t1(a) SELECT randomblob(2829) FROM c; + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10) + INSERT INTO t1(a) SELECT randomblob(3000) FROM c; +} + +do_catchsql_test 31.2 { + DELETE FROM t1 WHERE a MATCH X'6620e574f32a'; +} {0 {}} + +#------------------------------------------------------------------------- +reset_db +do_test 32.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-e2d47e0624a42c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 20 ....c.....g.... +| 4048: 10 16 80 10 60 10 20 30 10 16 90 10 60 10 20 40 ....`. 0....`. @ +| 4064: 40 60 60 60 80 80 70 10 30 01 40 30 90 00 90 00 @```..p.0.@0.... +| 4080: 00 01 12 40 00 00 00 00 10 10 10 00 10 10 10 10 ...@............ +| page 3 offset 8192 +| 0: a0 00 00 00 30 fe c0 00 ff a0 ff 30 fe 00 00 00 ....0......0.... +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 01 01 68 .d...e...f.....h +| 4048: 01 01 01 01 01 69 01 01 01 04 06 06 06 04 04 04 .....i.......... +| 4064: 06 06 07 01 03 00 14 03 09 09 09 0f 0a 03 00 24 ...............$ +| 4080: 00 00 00 00 01 01 01 00 01 01 01 01 0a 00 00 00 ................ +| page 8 offset 28672 +| 0: 01 0f fa 00 0f fa 00 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 1f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-e2d47e0624a42c.db +}]} {} + +do_catchsql_test 32.1 { + SELECT snippet(t1, -1, '.', '..', '[', ']'), + highlight(t1, 2, '[', ']') + FROM t1('g + h') + WHERE rank MATCH 'bm25(1.0, 1.0)' ORDER BY rank; +} {1 {vtable constructor failed: t1}} + +do_catchsql_test 32.2 { + SELECT * FROM t3; +} {1 {database disk image is malformed}} + +do_catchsql_test 32.3 { + SELECT * FROM t4; +} {1 {database disk image is malformed}} + +do_catchsql_test 32.4 { + SELECT fts5_decode(id, block) FROM t1_data; +} {1 {database disk image is malformed}} + +do_catchsql_test 32.5 { + SELECT fts5_decode(id, block) FROM t2_data; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 33.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-fed6e90021ba5d.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 08 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 06 0d b6 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d b6 00 00 00 00 00 00 ...k............ +| 3504: 00 00 00 00 00 00 56 07 06 17 1f 1f 01 7d 74 61 ......V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 8a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsi.et1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c af 00 0f e6 0f ef 0c af 00 00 ................ +| 3232: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 86 ................ +| 3248: 2f 84 80 80 80 80 01 04 00 8c 62 00 00 03 12 02 /.........b..... +| 3264: 30 30 01 04 05 03 01 04 05 03 01 04 05 03 1f 02 00.............. +| 3280: 03 01 02 03 01 02 03 01 08 35 30 30 30 30 30 30 .........5000000 +| 3296: 30 1c 02 04 01 0e ee ca ec ea ea ab e4 f5 ca b1 0............... +| 3312: ac ee ec de ef 3e ee ca ee ec f2 f8 0f f0 0f e8 .....>.......... +| 3328: 0f e0 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 ................ +| 3344: 0f a0 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 ...........x.p.h +| 3360: 0f 60 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 .`.X.P.H.@.8.0.( +| 3376: 0f 20 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 . .............. +| 3392: 0e e0 02 03 01 02 03 01 02 03 02 07 6f 6d 70 69 ............ompi +| 3408: 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 62 ler...........db +| 3424: 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 65 stat...........e +| 3440: 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 6e bug...........en +| 3456: 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 02 able............ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3520: 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 04 .....xtension... +| 3536: 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 03 ........fts4.... +| 3552: 01 02 01 02 03 04 01 35 0d 02 03 01 02 03 01 02 .......5........ +| 3568: 03 01 07 67 65 6f 70 6f 6c 79 10 02 03 01 02 03 ...geopoly...... +| 3584: 01 02 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 .....json1...... +| 3600: 01 02 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 .....load....... +| 3616: 02 03 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 ....max......... +| 3632: 02 05 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 ..emory......... +| 3648: 04 04 73 79 73 35 16 02 03 01 02 03 01 02 03 01 ..sys5.......... +| 3664: 06 6e 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 .nocase......... +| 3680: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3696: 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 ................ +| 3712: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3728: 01 02 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 .....omit....... +| 3744: 02 02 01 05 72 74 72 65 65 19 02 03 01 02 03 01 ....rtree....... +| 3760: 02 03 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 ....im.......... +| 3776: 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 ................ +| 3792: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3808: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3824: 02 02 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 ....threadsafe.. +| 3840: 02 01 02 02 01 02 02 01 04 76 74 61 62 07 02 04 .........vtab... +| 3856: 01 02 04 01 02 04 01 01 78 01 06 01 01 02 01 06 ........x....... +| 3872: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3888: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3904: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3920: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3936: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3952: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3968: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3984: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 4000: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 4016: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4032: 01 01 02 01 06 01 01 02 01 06 01 01 02 04 18 13 ................ +| 4048: 0c 44 10 12 11 0f 47 13 0f 0c 12 10 0f 0e 10 0f .D....G......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 57 24 24 0f D..@.......$W$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 1f 00 0f df 0f bd 0f 9b 0f 89 ....$........... +| 16: 0f 76 0f 63 0f 44 0f 24 0f 04 0e ec 0e d3 0e ba .v.c.D.$........ +| 32: 0e a2 0e 89 0e 70 0e 55 0e 39 0e 1d 0e 04 0d ea .....p.U.9...... +| 48: 0d d0 0d b5 0d 99 0d 7d 0d 64 0d 4a 0d 30 0d 10 .........d.J.0.. +| 64: 0c ef 0c ce 0c ae 54 d5 35 95 33 55 84 24 94 e4 ......T.5.3U.$.. +| 80: 15 25 91 a1 70 50 02 90 f1 94 54 e4 14 24 c4 52 .%..pP....T..$.R +| 96: 04 d4 54 d5 35 95 33 55 84 e4 f4 34 15 34 51 91 ..T.5.3U...4.4Q. +| 112: 60 50 02 90 f1 74 54 e4 14 24 c4 52 04 d4 54 d5 `P...tT..$.R..T. +| 128: 35 95 33 55 85 25 45 24 94 d1 81 50 50 02 50 f1 5.3U.%E$...PP.P. +| 144: 94 54 e4 14 24 c4 52 04 a5 34 f4 e3 15 84 24 94 .T..$.R..4....$. +| 160: e4 15 25 91 81 40 50 02 50 f1 94 54 e4 14 24 c4 ..%..@P.P..T..$. +| 176: 52 04 a5 34 f4 e3 15 84 e4 f4 34 15 34 51 71 30 R..4......4.4Qq0 +| 192: 50 02 50 f1 74 54 e4 14 24 c4 52 04 ae 4f 41 33 P.P.tT..$.R..OA3 +| 208: 55 85 25 45 24 94 d1 a1 20 50 02 90 f1 94 54 e4 U.%E$... P....T. +| 224: 14 24 c4 52 04 74 54 f5 04 f4 c5 95 84 24 94 e4 .$.R.tT......$.. +| 240: 15 25 91 a1 10 50 02 90 f1 94 54 e4 14 24 c4 52 .%...P....T..$.R +| 256: 04 74 54 f5 04 f4 c5 95 84 e4 f4 34 15 34 51 91 .tT........4.4Q. +| 272: 00 50 02 90 f1 74 54 e4 14 24 c4 52 04 74 54 f5 .P...tT..$.R.tT. +| 288: 04 f4 c5 95 85 25 45 24 94 d1 70 f0 50 02 30 f1 .....%E$..p.P.0. +| 304: 94 54 e4 14 24 c4 52 04 65 45 33 55 84 24 94 e4 .T..$.R.eE3U.$.. +| 320: 15 25 91 70 e0 50 02 30 f1 94 54 e4 40 0f 38 0f .%.p.P.0..T.@.8. +| 336: 30 0f 28 0f 20 0f 18 0f 10 0f 08 0f 00 0e f8 0e 0.(. ........... +| 352: f0 0e e8 0e e0 00 00 00 00 00 00 00 00 00 00 00 ................ +| page 6 offset 20480 +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 05 01 01 ................ +| 4080: 06 02 03 00 12 05 01 01 06 01 03 00 12 05 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 52 59 11 05 05 00 ..........RY.... +| 16: 17 0f 19 44 45 42 55 47 58 4e 4f 43 41 53 45 10 ...DEBUGXNOCASE. +| 32: 04 05 00 17 0f 17 44 45 42 55 47 58 52 54 52 49 ......DEBUGXRTRI +| 48: 4d 20 03 05 00 35 0f 19 43 4f 4d 50 49 4c 45 52 M ...5..COMPILER +| 64: 3d 63 6c 61 6e 67 2d 36 2e 30 2e 30 58 42 49 4e =clang-6.0.0XBIN +| 80: 41 52 59 20 02 05 00 35 0f 19 43 4f 4d 50 49 4c ARY ...5..COMPIL +| 96: 45 52 3d 63 6c 61 6e 67 2d 36 2e 30 2e 30 58 4e ER=clang-6.0.0XN +| 112: 4f 43 41 53 45 1f 01 05 00 35 0f 17 43 4f 4d 50 OCASE....5..COMP +| 128: 49 4c 45 52 3d 63 6c 61 6e 67 2d 36 2e 30 2e 30 ILER=clang-6.0.0 +| 144: 58 52 54 52 49 4d 0d 00 00 00 24 0e e0 00 0f 6f XRTRIM....$....o +| 160: 6e 74 65 6e 74 05 43 52 45 41 54 45 20 54 41 42 ntent.CREATE TAB +| 176: 4c 45 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 LE 't1_content'( +| 192: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 208: 52 59 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 RY KEY, c0, c1, +| 224: 63 32 29 69 04 07 17 19 19 01 81 2d 74 61 62 6c c2)i.......-tabl +| 240: 65 74 31 5f 69 64 78 74 31 5f 69 64 78 04 43 52 et1_idxt1_idx.CR +| 256: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 EATE TABLE 't1_i +| 272: 64 78 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c dx'(segid, term, +| 288: 20 70 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b pgno, PRIMARY K +| 304: 45 59 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 EY(segid, term)) +| 320: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 55 03 WITHOUT ROWIDU. +| 336: 07 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 .......tablet1_d +| 352: 61 74 61 74 31 5f 64 61 74 61 03 43 52 45 41 54 atat1_data.CREAT +| 368: 45 20 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 E TABLE 't1_data +| 384: 27 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 '(id INTEGER PRI +| 400: 4d 41 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 MARY KEY, block +| 416: 42 4c 4f 42 29 38 02 06 17 11 11 08 5f 74 61 62 BLOB)8......_tab +| 432: 6c 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 let1t1CREATE VIR +| 448: 54 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 TUAL TABLE t1 US +| 464: 49 4e 47 20 66 74 73 35 28 61 2c 62 2c 63 29 00 ING fts5(a,b,c). +| 480: 00 00 39 00 00 00 00 00 00 00 00 00 00 00 00 00 ..9............. +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-fed6e90021ba5d.db +}]} {} + +do_execsql_test 33.1 { + CREATE VIRTUAL TABLE t2 USING fts5vocab('t1','row'); + CREATE VIRTUAL TABLE t3 USING fts5vocab('t1','col'); + CREATE VIRTUAL TABLE t4 USING fts5vocab('t1','instance'); +} + +do_catchsql_test 33.2 { + SELECT * FROM t2; +} {1 {database disk image is malformed}} + +do_catchsql_test 33.3 { + SELECT * FROM t2, t3, t4 WHERE t2.term=t3.term AND t3.term=t4.term; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 34.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-a60a9da4c8932f.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 20 68 20 69 0d 00 00 00 03 0f e8 ...t. h i....... +| 3904: 00 0f f8 0f f0 0f e8 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 00 ................ +| 4080: 60 20 30 01 20 30 00 30 60 10 30 01 20 30 00 30 ` 0. 0.0`.0. 0.0 +| page 6 offset 20480 +| 0: a0 00 00 00 10 ff 40 00 ff 00 00 00 00 00 00 00 ......@......... +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 00 00 00 00 00 00 00 00 00 11 87 89 06 26 ...............& +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 44 00 06 06 07 01 03 00 14 03 09 09 09 0f ..D............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-a60a9da4c8932f.db +}]} {} + +do_catchsql_test 34.1 { + SELECT fts5_decode(id, block) FROM t1_data; +} {1 {database disk image is malformed}} + +do_catchsql_test 34.2 { + SELECT fts5_decode(id, block) FROM t2_data; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 35.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-ae135cb10977c7.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 3d ......0000000..= +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 07 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0e fc 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 01 2f 0d d5 ...t.[.@.$.../.. +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 8f DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 57 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000WBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 59 4e 4f 43 41 53 45 17 LE RTREEYNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4f 41 42 4c NARY....)..EOABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 51 53 45 E GEOPOLYXNOCQSE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 1d 05 E FTS5XNOCASE... +| 3728: 00 23 0f a4 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 55 53 34 58 42 49 4e 41 52 59 17 0b LE FUS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-ae135cb10977c7.db +}]} {} + +do_catchsql_test 35.1 { + SELECT * FROM t1 WHERE t1 MATCH 'e*'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 36.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename crash-a6651222df1bd1.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 63 73 !...tablet1_docs +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 11 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 03 02 03 04 0a 19 8c 80 80 ....tab......... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a 00 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 00 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 01 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 13 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 05 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 64 61 62 ............0dab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 03 02 08 04 01 ...0n........... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 01 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 14 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 74 .....2th......2t +| 4016: 16 07 04 09 10 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 0c e9 ................ +| end crash-a6651222df1bd1.db +}]} {} + +do_catchsql_test 36.1 { + INSERT INTO t1(b) VALUES( + x'78de3fa24af3733ca8769291a0fee3669f9fddefc5cba913e4225d4b6ce2b04f26b87fad3ee6f9b7d90a1ea62a169bf41e5d32707a6ca5c3d05e4bde05c9d89eaaa8c50e74333d2e9fcd7dfe95528a3a016aac1102d825c5cd70cf99d8a88e0ea7f798d4334386518b7ad359beb168b93aba059a2a3bd93112d65b44c12b9904ea786b204d80531cdf0504bf9b203dbe927061974caf7b9f30cbc3397b61f802e732012a6663d41c3607d6f1c0dbcfd489adac05ca500c0b04439d894cd93a840159225ef73b627e178b9f84b3ffe66cf22a963a8368813ff7961fc47f573211ccec95e0220dcbb3bf429f4a50ba54d7a53784ac51bfef346e6a'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 37.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename null-memcmp-param-1..db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 66 74 34 74 34 43 .....utablft4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 64 44 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G dDs5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 01 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 5a 02 01 01 62 01 .t.....0a.Z...b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 02 ....c.....g..... +| 4048: 01 01 68 01 06 01 02 03 01 01 69 01 06 01 02 04 ..h.......i..... +| 4064: 04 06 06 06 08 08 07 01 03 00 14 03 09 00 09 00 ................ +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 04 04 06 06 07 01 03 00 14 03 09 09 09 0f ................ +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 30 69 .a b cd e fg h0i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end null-memcmp-param-1..db +}]} {} + +do_catchsql_test 37.1 { + SELECT * FROM t3; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 37.0 { + CREATE VIRTUAL TABLE t1 USING fts5(b, c); + INSERT INTO t1 VALUES('a', 'b'); + SELECT quote(block) FROM t1_data WHERE rowid=10; +} {X'000000000101010001010101'} + +do_execsql_test 37.1 { + UPDATE t1_data SET block = X'FFFFFFFF0101010001010101' WHERE rowid = 10; + SELECT rowid FROM t1('a'); +} {1} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 38.0 { + CREATE VIRTUAL TABLE t1 USING fts5(b, c); + INSERT INTO t1 VALUES('a', 'b'); + INSERT INTO t1 VALUES('a', 'b'); + SELECT quote(block) FROM t1_data WHERE rowid=1; +} {X'020202'} + +do_execsql_test 38.1 { + SELECT * FROM t1('a b') ORDER BY rank; +} {a b a b} + +do_execsql_test 38.2 { + UPDATE t1_data SET block = X'000202' WHERE rowid=1; +} +breakpoint +do_catchsql_test 38.3 { + SELECT * FROM t1('a b') ORDER BY rank; +} {1 {database disk image is malformed}} + +db close +sqlite3 db test.db +do_catchsql_test 38.4 { + SELECT * FROM t1('a b') ORDER BY rank; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 38.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-fd2a1313e5b5e9.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 b8 31 5f 63 6f 6e 74 !...table.1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 01 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 ec 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 01 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 60 35 30 30 30 30 MAX MEMORY`50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 44 4d 4f 52 59 3d 35 30 30 30 .MAX MDMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 16 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 05 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 10 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 05 f1 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-fd2a1313e5b5e9.db +}]} {} + +do_catchsql_test 38.1 { + UPDATE t1 SET b=quote(zeroblob(200)) WHERE t1 MATCH 'thread*'; +} {0 {}} + +#------------------------------------------------------------------------- +reset_db +do_test 39.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 24576 pagesize 4096 filename crash-e650fe95502908.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 63 73 !...tablet1_docs +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 32 2c 32 2c 33 ,b,prefix=.2,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 03 02 03 04 0a 19 8c 80 80 ....tab......... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a ff 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 00 f1 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 01 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 05 04 08 08 84 80 80 80 81 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 61 80 80 80 11 03 00 3c 00 00 ......a......<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 71 .......6.....2tq +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 0b 89 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 f4 01 02 03 01 03 66 .....0eac......f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 03 02 08 04 01 ...0n........... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 b3 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 04 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 05 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 2d .....2th......2- +| 4016: 16 07 04 09 10 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 03 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 02 09 ................ +| end crash-e650fe95502908.db +}]} {} + +do_execsql_test 39.1 { + SELECT rowid FROM t1('t*'); +} {1 2 3} + +#------------------------------------------------------------------------- +reset_db +do_test 40.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 24576 pagesize 4096 filename crash2.txt.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 52 6c 65 (a)V.......taRle +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 73 73 !...tablet1_doss +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 75 73 34 03 02 02 01 04 6e .....4fus4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 05 62 03 04 0a 19 8c 80 80 ....tab.b....... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a ff 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 11 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 02 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 06 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 00 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 10 f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: bd 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 05 52 08 04 01 ...0n.......R... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 b3 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 04 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 74 .....2th......2t +| 4016: 16 07 04 09 10 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 02 09 ................ +| end crash2.txt.db +}]} {} + +do_execsql_test 40.1 { + BEGIN; + INSERT INTO t1(b) VALUES(X'819192e578de3fa24af3733ca8769291a0fee3669f9fddefc5cba913e4225d4b6ce2b04f26b87fad3ee6f9b7d90a1ea62a169bf41e5d32707a6ca5c3d05e4bde05c9d89eaaa8c50e74333d2e9fcd7dfe95528a3a016aac1102d825c5cd70cf99d8a88e0ea7f798d4334386518b7ad359beb168b93aba059a2a3bd93112d65b44c12b9904ea786b204d80531cdf0504bf9b203dbe927061974caf7b9f30cbc3397b61f802e732012a6663d41c3607d6f1c0dbcfd489adac05ca500c0b04439d894cd93a840159225ef73b627e178b9f84b3ffe66cf22a963a8368813ff7961fc47f573211ccec95e0220dcbb3bf429f4a50ba54d7a53784ac51bf'); + INSERT INTO t1(b) VALUES(X'c8ae0d0e7c3175946e62ba2b449511d4eb504079984a20f77969f62206c9f3d7ea25358ab705e6978627290b6d48db9032f815a06a79a4f4b809841a0942eed12954ed166f666111812a508abc3bec87958846edaec0a6fe14564bc0a4b78f1c35ebcacca6bae29cc37ae9b59d8a2d7593af1e47dda0ece2268a98d20febafad037964f139851f9a57f48b3706b01721769071991412044cd6006f1d72eb6eb4aa5ad77e378176db8c15575fbeee47165e38a7c6c5a557ac2dfe11813976eaf6741cf593a9e457053a3c34cddfbe605a6e25419f993de8374fafcd3636509d8416a51dc7bcc14cfca322ae343078f47e23522431c17d0da0c033'); + INSERT INTO t1(b) VALUES(X'dc29a94e873a45a4243fce9b912aaefbadf1d0423e0345793874b356eeb500b92fb05284c1601fe9bad3143f72162f10242cec27c44ebf764c8fc9fb0824e32c4161472a4f914f579e0e8274f08ca1a02e59b9d8eec1f31061f9ccb9ed97a6f06534e991f7992c761489e6a7724f6e9c2b581e77487ded3a986d53c4419bbd3e9747cee300e670dd7294874c77e2ed48da68eaa6c3ec954a09ac410493d98e34d6686e54fbbe80696705f10e040c66093efb40746b33600685c94c664c7942835a9e954866121d5dcfb2cb12e92521ea3df175ee17072502dad9b9c1565f801b2179799011eb7418bfa00323e3157589e648ff7378be233c79b7'); +} + +do_catchsql_test 40.2 { + INSERT INTO t1(a,b) VALUES(1,11),(2,22),(3, true ),(4,44); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 41.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); + REPLACE INTO t1_data VALUES(1,X'255a5824'); + REPLACE INTO t1_data VALUES(10,X'0a1000000102020002010101020101'); + INSERT INTO t1_data VALUES(137438953473,X'0000032b0030300102060102060102061f0203010203010203010832303136303630390102070102070102070101340102050102050102050101350102040102040102040207303030303030301c0204010204010204010662696e6272790306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020108636f6d70696c657201020201020201020201066462737461740702030102030102030424656275670402020102020102020106656e61626c6507020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020202087874656e73696f6e1f02040102040102040104667473340a02030102030102030401350d020301020301020301036763630102030102030102030206656f706f6c7910020301020301020301056a736f6e3113020301020301020301046c6f61641f020301020301020301036d61781c02020102020102020205656d6f72791c020301020301020304047379733516020301020301020301066e6f6361736502060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020301b10202030601020201046f6d69741f0202010202010202010572747265651902030102030102030402696d010601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202010a746872656164736166652202020102020102020104767461620702040102040102040101780106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020415130c0c124413110f47130f0c0e11100f0e100f440f1040150f'); + INSERT INTO t1_data VALUES(274877906945,X'00000183023030250601011d010331c2ba250601010d0101342506010121010135250601011e02036ec2ba250601012b0101382506010112010161250a0101021a1d02016f2506010111010162250601013201026377250601012f010166250801011f0c010167250601012701026863250601010f02026473250601013002016b2506010133020175250601010e010169250601012c0204386ec2be250601012001016a250601010401056bc2b2cebc250601010901016c25060101150203cebc71250601011301036dd18a250601010c01016f25060101260102706425060101240101712506010122010173250a010116040d02016f2506010134010175250801011b14020161250601010b010376c2aa25060101100202d7ac250601010601017725060101030201752506010114010179250a0101190e050202357a250601010701017a250601012e0102c2aa250801011c100201b3250601010a0202ba6225060101310203be656625060101080103c5a77425060101050102de8e250601011704080a08080a080a080809090809090808080b080c080a0a0809080a0809080a0908080a09080a08090a0a'); + INSERT INTO t1_idx VALUES(1,X'',2); + INSERT INTO t1_idx VALUES(2,X'',2); +} + +do_catchsql_test 41.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +do_catchsql_test 41.2 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 42.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename 8cfba7fbb67e48de92c6.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 62 72 79 03 06 ........binbry.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 01 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0b 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4f 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 OARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 57 42 49 NABLE GEOPOLYWBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 42 41 53 45 E GEOPOLYXNOBASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 52 02 49 4e 41 52 59 27 20160609R.INARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 5d 69 7a 65 uild....opti]ize +| end 8cfba7fbb67e48de92c6.db +}]} {} + +do_catchsql_test 42.1 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 43.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename 89028ffd2c29b679e250.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 63 73 !...tablet1_docs +| 3744: 69 7a 65 74 31 5f 12 6f 63 73 69 7a 65 04 43 52 izet1_.ocsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5e 64 61 74 61 02 et1_datat1^data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e8 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 00 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 03 02 03 04 0a 19 8c 80 80 ....tab......... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 94 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a 00 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 04 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 01 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 00 90 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 07 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 05 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 71 01 02 05 04 08 18 84 80 80 ......q......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 91 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 05 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 03 02 08 04 01 ...0n........... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 02 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 04 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 74 .....2th......2t +| 4016: 16 07 04 09 10 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 02 09 ................ +| end 89028ffd2c29b679e250.db +}]} {} + +do_catchsql_test 43.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 44.1 { + CREATE VIRTUAL TABLE t1 USING fts5(a,b unindexed,c,tokenize="porter ascii"); + REPLACE INTO t1_data VALUES(1,X'03090009'); + REPLACE INTO t1_data VALUES(10,X'000000000103030003010101020101030101'); + INSERT INTO t1_data VALUES(137438953473,X'0000002e023061011202010162010203010163010204010167010601020201016801050102030101690106010204040606060808'); + INSERT INTO t1_data VALUES(274877906945,X'0000001f02306702080201020201016802080301020301016a420804010204040909'); + INSERT INTO t1_data VALUES(412316860417,X'0000002e023061030202010162030203010163030204010167030601020201016803060102030101690306010204040606060808'); + INSERT INTO t1_idx VALUES(1,X'',2); + INSERT INTO t1_idx VALUES(2,X'',2); + INSERT INTO t1_idx VALUES(3,X'',2); + INSERT INTO t1_content VALUES(1,'a b c','d e f','g h i'); + INSERT INTO t1_content VALUES(2,'g h i','a b c','g h i'); + INSERT INTO t1_content VALUES(3,'a b c','g h i','g h i'); + INSERT INTO t1_docsize VALUES(1,X'030003'); + INSERT INTO t1_docsize VALUES(2,X'030003'); + INSERT INTO t1_docsize VALUES(3,X'030003'); +} {} + +do_catchsql_test 44.2 { +INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +do_catchsql_test 44.2 { + SELECT snippet(t1, -1, '.', '..', '', 2 ) FROM t1('g h') ORDER BY rank; +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 45.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename crash-0b162c9e69b999.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 52 6c 65 (a)V.......taRle +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 73 73 !...tablet1_doss +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 75 73 34 03 02 02 01 04 6e .....4fus4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 74 6d 03 06 01 ...<.....3ntm... +| 2528: 01 05 01 03 74 61 62 05 62 03 04 0a 19 8c 80 80 ....tab.b....... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a ff 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 11 03 00 16 00 00 01 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 02 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 06 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 00 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 10 f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: bd 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 2f 03 34 74 20 07 04 01 0e 01 03 34 1e .../.4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 02 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 05 52 08 04 01 ...0n.......R... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 b3 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 04 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 74 .....2th......2t +| 4016: 16 07 04 09 10 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 02 09 ................ +}]} {} + +do_catchsql_test 45.2 { + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); + INSERT INTO t1(t1, rank) VALUES('merge', 5); +} {0 {}} + +#-------------------------------------------------------------------------- +reset_db +do_test 46.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-1ee8bd451dd1ad.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 60 t2(x)V.......t` +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 3d ......0000000..= +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 07 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 06 e2 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 31 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DS1FE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 40 42 4c 45 20 52 54 52 ...%..EN@BLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 59 42 ..ENABLE JSON1YB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 15 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f a4 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 04 f0 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 22 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 a2 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-1ee8bd451dd1ad.db +}]} {} + +do_catchsql_test 46.1 { + SELECT snippet(t1,'[','', '--',-1,10) FROM t1('*'); +} {0 {{}}} + +#-------------------------------------------------------------------------- +reset_db +do_test 47.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename 4b6fc659283f2735616c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 7d 42 5f 63 6f 6e 66 69 67 74 32 table.B_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6f 74 74 31 5f 63 6f 6e 74 1_conteott1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 46 52 20 50 52 49 4d 41 52 59 INTEGFR PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 06 01 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 00 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 01 ....c.....g..... +| 4048: 01 01 68 01 06 01 02 03 01 01 69 01 06 01 02 04 ..h.......i..... +| 4064: 04 06 06 06 08 08 07 01 03 00 14 03 09 00 09 00 ................ +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 03 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 04 04 06 06 07 01 03 00 14 03 09 09 09 0f ................ +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end 4b6fc659283f2735616c.db +}]} {} + +do_catchsql_test 47.1 { + SELECT snippet(t1, -1, '.', '..', '[', 50), + highlight(t1, 2, '[', ']') FROM t1('g h') + WHERE rank MATCH 'bm25(1.0, 1.0)' ORDER BY rank; +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 48.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-44a8305b4bd86f.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 09 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 42 4c 4f 42 29 5e 05 07 17 21 Y, sz BLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 ...-tablet1_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 62 72 79 03 06 ........binbry.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 01 03 16 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 04 71 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ..q.........comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 01 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 03 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 13 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0b 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4f 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 OARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 46 45 58 4e 4f 43 41 53 45 17 LE RTRFEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 57 42 49 NABLE GEOPOLYWBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 42 41 53 45 E GEOPOLYXNOBASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 66 54 41 42 58 52 54 52 49 4d 11 06 TAT fTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 62 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XbTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 52 02 49 4e 41 52 59 27 20160609R.INARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 0f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 06 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 06 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 06 07 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 03 00 12 06 01 01 ................ +| 4080: 06 02 03 00 12 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 67 72 .........+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 5d 69 71 a5 uild....opti]iq. +| end crash-44a8305b4bd86f.db +}]} {} + +do_catchsql_test 48.1 { + INSERT INTO t1(t1) VALUES('integrity-check'); +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 49.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-fd87385402ecf5.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 20 68 20 69 0d 00 00 00 03 0f e8 ...t. h i....... +| 3904: 00 0f f8 0f f0 0f e8 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 00 ................ +| 4080: 60 20 30 d6 20 30 00 30 60 10 30 01 20 30 00 30 ` 0. 0.0`.0. 0.0 +| page 6 offset 20480 +| 0: a0 00 00 00 10 ff 40 00 ff 00 00 00 00 00 00 00 ......@......... +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 00 00 00 00 00 00 00 00 00 11 87 89 06 26 ...............& +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 44 00 06 06 07 01 03 00 14 03 09 09 09 0f ..D............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 9d 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-fd87385402ecf5.db +}]} {} + +do_catchsql_test 49.1 { + SELECT term FROM t4 WHERE term LIKE 'oase'; +} {1 {database disk image is malformed}} + +#-------------------------------------------------------------------------- +reset_db +do_test 50.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-695bce8a3e107c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 65 74 32 5f 63 6f 6e 66 69 67 74 32 tablet2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: 6f 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 20 68 20 69 0d 00 00 00 03 0f e8 ...t. h i....... +| 3904: 00 0f f8 0f f0 0f e8 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 00 ................ +| 4080: 60 20 30 d6 20 30 00 30 60 10 30 01 20 30 00 30 ` 0. 0.0`.0. 0.0 +| page 6 offset 20480 +| 0: a0 00 00 00 10 ff 40 00 ff 00 00 00 00 00 00 00 ......@......... +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3984: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 4000: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4016: 01 01 00 00 00 00 00 00 00 00 00 11 87 89 06 26 ...............& +| 4032: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4048: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4064: 06 04 44 00 06 06 07 01 03 00 14 03 09 09 09 0f ..D............. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 8 offset 28672 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 9d 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-695bce8a3e107c.db +}]} {} + +do_catchsql_test 50.1 { + SELECT term FROM t4 WHERE term LIKE '»as'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 51.1 { +BEGIN TRANSACTION; +PRAGMA writable_schema=ON; +CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); +CREATE TABLE IF NOT EXISTS 't1_data'(id INTEGER PRIMARY KEY, block BLOB); +REPLACE INTO t1_data VALUES(1,X'2eb1182424'); +REPLACE INTO t1_data VALUES(10,X'000000000102080002010101020107'); +INSERT INTO t1_data VALUES(137438953473,X'0000032b0230300102060102060102061f0203010203010203010832303136303630390102070102070102070101340102050102050102050101350102040102040102040207303030303030301c023d010204010204010662696e6172790306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020108636f6d70696c657201020201020201020201066462737461740702030102030102030204656275670402020102020102020107656e61626c6507020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020201020202087874656e73696f6e1f02040102040102040104667473340a02030102030102030401350d020301020301020301036763630102030102030102030206656f706f6c7910020301020301020301056a736f6e3113020301020301020301046c6f61641f020301020301020301036d61781c02020102020102020205656d6f72791c020301020301020304047379733516020301020301020301066e6f6361736502060102020306010202030601020213060102020306010202030601020203060102020306010202030601020203060102020306010202030601020201046f6d69741f0202010202010202010572747265651902030102030102030402696d010601020203060102020306010202030601020203060102020306010202030601020203060102020306010202030601020203060102020306010202010a7468726561647361666522020201020201020201047674616207020401020401020401017801060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102ad060101020106010102010601010201060101020106010101010601010201060101020106010102010601010201060101020106010102010601010201060101020106010102010601010201060101020415130c0c124413110f47130efc0e11100f0e100f440f1040150f'); +INSERT INTO t1_data VALUES(274877906945,X'00000e96023030011a042319320d3b123d812b5a31120110446e581b66814a05010a4537814274010e8102815c810f3d0104846d01081581204401103741043c59416b44010a404655265301103f73811a11114213010a821235820f020135030484320201360104816a020162020484550302390301710a04824a020166030483690201670704837d0201690404822602016a0504825c02026b620504817502016f0904810d0303e79c88060482760201700a04826302017204048155020373c2be050481130201770204846202027962050482710202c2ba010482140203e58496070483330204e8b2b879010483710101310110545c0c814b0e3a6501082c815d5b011a2a0e2f0d765c3d686014061d0d0112810733112c2e82141101048313010e5c6f632e813e42010c811882370548010e19158146822f1f01104d364a708146135a010a237b0a55210201610904841703027678090481270201620304810002026374060484660202657a0704827602016601048351090483540301660704814b02016b03025f0304c582caba0204816602016c01025f0302cebc0904843e02016e0804821802016f0a04817503016f070483100201720304822c020484380201740404842e0102460201770104812f0204836c02027a6f040483110202cebc02048267040161020484650205d5bd62cebc0604845b0204f2a580880204842a0206f38184a179670502750204f696a3aa0a04814601013201063330390110812281378114600d010c03716c5e822d010e81226b542a814d010a72740f83000108813a1e0b010c5681046f812c010c07814a777328011664244219531b1a2f811e4a010c4d81557c7f1b0201300704810702013307048230010484050202367807048175020239710804832502016204026b0204814d020363306108048262020265650504817602026667070483150201690704832f0301360a04814d02016c08024702016d0304843e0303cfb2630204814002016e0804837503016203048416030370c2be0304821b02016f0604834b0201700504816b030175070210020273660604841c020676c2bac2b2640604830a02017704027d02017808048141010482700201790504811d0202c2ba0502470206ca8d73ecbab9010483340204f09e9ab504048367010133010c3e04814f82250114812e814b2e0411811305010c811337811e6e010c82085e2b0e5d010c61812054811c01148122451b0781050c813d010c17823762643e011e080c1720814a10364306143b0d33260112810f0c2a810c816b13010a8163810e470201370404811102056176c2aa36050481530202646e0904846202026a730404827402016b0a020c02036f616b0404830a0201750504820d02017605025e0201770a04820702027a73050482460202c2ba0604824a020483330203cba434040483200203cebc790304847e01013401124181442c1d091f81580108601d8336011081320a2b8125820001123b0b81158116811f070110078112817a817308010e6682410d810e2601122d0d6413378147351e01105081021d3525812d01128246510a622204054101105c1b620e81302b05020130020483480104822702013102027e020132030483270201350304844802023770030207020261710604823f0201640802570204830a020265770304831f020168070483210201690204825b02016f020481280704835402057037e18b8d0904810802017304048439030172020481440303c2bd6b0a02630201760202490804815e0201770304816e050483550201780704816902017a070483280207c2b2f093aabc780a0482240301b303024e0301bc0604837a0202cb800204834a0202cebc04048201040484410203d3ad770a04814f0202d5a508048371010135011630817e0f81040d2c041552010c813d3b7e8115010c40692182693a01121f810d810d0a32814701101d1d1f642281742e01068229240110811231810a387f4c01100f50810f8165810d0114811f26443152593c104a010e641e1a3357820e020132030481540201340204815402023778040207020163060481020204815b020164020483010201670a0481540304f0948f870904811a0201690704835502016d0604832203027b01022803017a0a025102016e020484260404816002026f690502680301720104834e02017208024f02021d020475e69c8e0504814c0202767602025f0302de870a04837b020178090483200104835003026a72090484400201790504837204022302017a0104836b0202c2aa0a0481070303bcc2b3090484370203c7866403027501013601087c158303011212814305813e7b0e090118141a1c49713a211e0c74630f010a59826d8113011203328166037781561a01101d7f1d2a1f822533010e820e070f7b40160110811f40292c813226010a2d20824a32010a81418158670201300304840a0201660404817d02016d0804826902016e080626817f0104820b02016f0404825a02017003023b020272750804840c0301760a04844d02017403025b020175080484200202766e060482360303c2ba6c030482220202c2aa0204810e0301b20204835703048421040484240301bc0802410202d2a1010482630204e1b18f3704048354010137010c08816337812f01101382211532424d39010881248123010e7724810267815f011081236029813e273301101b7b29812a5b813b01128150810324814b220b01060c8417010e165b6c81708117010a1782346f6c0201380804816803016b0604840102013908023f0201610204816c0201630302760201640304832604023e0204833902016502048203020266770804821a0201670a04830002026964080484500304f29e9eb70802250201700204811b0201710904832d0201730304826b05048403020174010481000205776a62c2b2050482630201790202260206c2b2eaaeb464050485020301b3080482480303bac7af0a0484550203c695650804822a0202ceb90a0481170202dbae05023f010138011819814a2703390a61090c6912011a21181304812523811b5f164e050114110f35128123423f810c010c817573817c03010e7182590c812b0401142503597e6e0e2f3a3759011252813a811a2b75091a010882162a31010e17450a81048279010858658208020231670a048205020361c2b906023b02016301048236020164050482520201650904833d0201670904811b0201690604825002026a7a0604837c02016e0204832002017002026d0302c789010481020201720504835e0201740604810002017502020a0702630302676306025f0303e4a0a70102640203786a75010484440201790104841402047ac2be72070481340207c2ba3766673576090482790301bd07048142010481600202c7b309027a0401740604823b0202d2bf0304830f0204e989a6300a02600204f4bd91b60702120101390106518369010e19254641823711010c258267288121010e817c810d2b17250110810a578133812f4c0110415681067b288121010e0881208119347101140b8131543c8100343d1101088203813e01100d742e3230820f3802013006048107020134080481440202356501021a02013808048147020162020482230201630304833c030162050483390206656cf093b5bd070484140202677303048502020769e3ad9669c2b90304847402016b0804836402016c0404841f02016d010481250904825202016e06025402016f0704842a0201700a04834a0201720a0483530201750304822e020676f097b18374030482140201780604833d0202c2b9010481550301be070483720204826f0202ca80060481630202d5a80504833f0101610114551047810e130a78660c011a364611206c0b13080705733d5501240f08070c090b0c20813d1471042e4351131e011204412d814f0913104201263036110d060b1f811a301b0f4e1a29092f181c012808071e221a2a81075b320503065a0f140c1a0a26011c07231d0e6f3715063b760c6b091501121111303e3a71566d6d010e0867814d816a0c01181e18240d41724d221b3f384b0201300204830b060483080302c2b30204837f0201310a026e020134050481560301730902690201360406827c0f0201370204825d06020a0201390904815b0304f3bfb2a70a04822c0201610404810e020262660604841a03017608025b02016309088112825f020164090482310201650a0484480302396f01025d02026774010482090302df9b06048321020168070661813303016f03048248020169030483610504814001048401010483460301300704824203016a0204824402016a0504813303021d03017209048412030277380804824502016c0104814c02036ec2ba0804835702016f0204811d030176020238020270360a04840d02017107048201030469ca99690602350201720304812d0104845e02017304022c02017409022b020175050484140302caaf0402410201760404831f020177010484180704845203026f6d04024b02017a030482660202c2aa0204810a0301b30a04817b0302bd76020483780302be6a0302440202c58207025e0202c69901027a0302ad77010483200206c993f099b183070484270203caa1660204841a0204f29788ac0804831d0204f4ba9f950504843c010162011c0e33810216341c2413042130780501184d373e53131f2f052907423e010c830e3781390e011c1320461f81041b811b041e15243d011e241b10816c310b130c3133033b0741011a11816d3139100c13140b395848011c580e411a06304306810a3138330d011a441707092c70140c1643813920010c73653581374f010c826c81210f0402013803024f07048172020161020481650204810c020162030483470301370404813602016307048379020483280201640304815501048176010481060201650104812a0104841f0201660504821f0201670302700201680804846403016b0a04831d0301700904845502016908025c02016a010483560904827602026b6306023402016c0404832602016d040484410204825702016e0504831603027831020482160302c2be0504827d02026f6a05048121020171030232020483220304845402023a0201720204845c0304846e03013607048224020174060484480201780704844303016f0604814f045807070a0707070707080709070709070808090a5c07080708080b07060a06080707070b0a0b0808070b0a0b0a55070b08080a0908080707060709070709070706080c060b07070c0a66070b08080609070607080c0909660b06070707080a0807070b0b0707080a0b07070d0607080c0908630707070b07070a070d060b0707090a07080b080a070809085f0707070c0706080706070809080f06080a5807070607060e070807080907070b070b060c0709090807690808070707070708070608070709070809070a0d0b07070809095b070707070707070c080d07070b06070707070c07080b0808811a0b08060706080a070a07080609070707080808071307070a0708070907060807090b06060707070b0707080708070707080c090a0a81080a0b07070b0f0b0706070707060b07070b07080808110b070707'); +INSERT INTO t1_data VALUES(274877906946,X'00000e880330627a020482240202c2aa0a04833f0301b30704844b0302b9650704824f0301ba0204845f0202c9820a0483640202d194060482300203e19cbd0904844b0203e691b4050483510205e78dadde9b0104821201016301142a6c033b8151085c094601140b813d49313f81110e1c011681163611221527257f5d38011c150f22811a0a3c12350631238117011c3e26420b402c1d81080c40150b2f01181c3143382640273d60132e070118663b1d162a1b0e2e8111393e0110821117310e52811c01141a2f49810181391f2b130112323c0305812a6f2e390201320204842702023334020481340201350202610201360304844603023362040484470203376a360a04826b02013808026203016f0704830d02013902025502016106088170827a0301320a04820403016c0404831502016204048327050484030201630a04814302016401048349020484760302430301640204845d02016504048249020367c2bd07020a0302cebc0902150201680a02500201690204846102016a06024c0301770504842b02016b0104830e0704811803023370040483580301710404845f02016c0504844f0204820d0204837f0302c2aa0104833702016d0104844c02016e0804834f03026c6a07025702046fecbd9a01023a020270330204830a0301740304837c020271350204811e0201720706833b310206736ef09289b70104832b020174070483290301320204827c02017608022802017806025b0302c2b30904835202027978080483040303c9b56f0904846a0202c2aa04048127050482120301b30504813a0301b901024204016a0704840c0202c5820704823c0202c999010482470202cebc0602400203db91670602730202dca7050482760203e1a3950304817e0203e786a702048273010164011a0612105b292b817c1211080d5a01147c1d420b35451c36811a011e0e168117081c0c2e051d474055192d011e02050a1c81180420250f815f300f21011c02316a37143321443a10042d54230112761428810e4750054101101805072b8215294e0116680f0f5381445a3e0b070901224e4a41210c361c281b101c43051325130f01185a1e19108106300f2e3f4538020130060481370202327305022002013405048168020335377a03021802013704027b02013804048260020161030882118101030263650904814d0201620604822502016303048419030135090483240201640602280301380404817e0201650404823c0304f097ac9f010482680201660a0267030566e2b6936f0104821c0201680704813302016b0604832002016c01026a0301610204843202016d0804845e03026d6d03023c020270730a04817f0304c2be797a0804832e020271710504835f02017203021b0201740204825a02017706027202017805048451010683572e03016e0a04814c0201790304811702017a080484450302c2b90204837b0202c2aa0604825b0303b273630104841c0301b9050485040301bc0a027b0303bd37680502670202c98b0204826b0203cfa1740504823a0203d199610202350203e3bf87040483570204f1baaba90504817301016501120b8104392d0d20180f011645213f292e4d0d082f8165011e0b400c07341b2329307f193338173a012055292409050c560a272a0f4403245718011a1c3a183f1c43264c3126060829012081208102043a044d0621650b180e150e011a066c030e513d7d265e1313130c0118171953040457347b114d191901261b1c060c26090d6f0d332a1519096e03101d1d012207342f1f2c7e2517251d0f310d2a17081e02013005020a02013308048247020135030483660201380704841b030132030482180201610102600604825f0304c2bdc2ba02023a02016209021f0201630604813002056663cebc610604841e0201670504816a0104842703037177310604833f03027872080482350201680604825e02016a040483320104840d02016b0304813f02026c6408020602016d070481590104837d03016c08020d02016e060484630301780404815c02016f0104826b0804825e02017008027b0302c2aa0504847c0201710404836d0201730402510302cebc08048338020375c7bf05048344020177010482660304822303026479070481630204786ec2ba0204814f0202796a0a04834f02017a01048407030484660604810603026561020483180204c2b278390504813d0301b304024f04026536010483110302b9330604813e0301be0304840b040484560202c4a702022d0206c6a5f7ada9990402350202c79f090481180202caa60502140204cebcc2bd080483320202db900a0481250205f4b5aa9079040484360204f7b985bd0204835e01016601128101285c096981190e01121f813f0d431a8135530114698102813228492f190a011260161881328101812601188155780d813257050c0b04060114161681340772811b5e25011c4505810e13290b253a0c0c0a1a4b011a3714133e1235812b136b062c0b011a6b591356810c3c240906250b1001148127810d413e0e81090d020231680504822c0302c2bc0204830c0201360104840c0303656a740902110302d1950504824f0201370902130201390a0482530303e0a9ae0904844c0201610804810d0201620a04810c03023039030481330302356902048268020163060483470201650504822d02016706048200030483560302713509025002026a79010484410804825902016c0504822002016e07020d0304843a02016f0204842d0201710304837604048361030482430201720904840f020173020482520804810b02017406068425320201760202420201780804845d02037979650704814802017a080481110301780804812c0202c2bd070484600202cebc0508813082410102770401610202250202ddb40302310205f19e9a937a030482410101670118365558195a0a062d0581260a011881068143330844041f0a1851011a2025141e1081204f550e077521011a193b1f58351912265681220821011812070528472f4e2f407f204a01124d1e1f811b810d7b4d01180f1d3481034a35580a12811f011c2303340d1470150778070c812331011620411939703c032915143f01104281116a3d323c6a0201350604842902013703023f0201390a04816e0201610604826402016202023f0201630a04843302016409048258020165020482620404814702016602061b833f0201670404827d03026369020227020169040483490301670604847602016a0604845d0404840902016c04024601088150822b010482350204830a0301690304844902016d0202710704820002016f03048509020482380304836603026e74010483580201700504817a020171020481080204826a0201720304837b0202410302160302c2b3080484550201730904816e020174040248010484280304834e020275730404836e020176060484720104815c02017709026a020178060275040483790201790504821501026c030170080483770304cfb269710704815102017a0204813303016f090483160202c2aa050481400301ba0804810b0401630804830d0301be0604844d0202c8a30a02110203cba0640204816a0202cebf060482420204e487856e030481080204ec97bd6d080484080205f09eb3a0770502260208f687999931ed878703048424010168011a12460e090c036e151b812e065501161708411982151738471f35011a2d1c0678340c1f04425c21200c010c2a087f255d4a011a0d0b6c33814a212c3a0a401b1e011c501f2381010a0481201c0c6012280118150b5228520e0a036c1c8123011a15810a060408030a81563f381601185b1b06212a143f332a60160e011a221b1e62411d2048090e0b0f5502033072350804826a020131020482530201320304823b0201330104814502033677380204813102026174020483540304dbbf6f620404835d0201620504846a0104831803017103048323020164060483740201660a02410201690102130104821402016a0504823f02016c0404832e02016d09022602026e640a04822702016f070482000301750402670201710304813106020d0202726304048220020173060484530201750504831e020483400302c2bd0704843a020177020483470203786371030483740201790904810002017a0302300202c2b9080483280301bc010481700303bd33720304825e0205c99973c2bd040483160203d5a6330a04842b0204e7b3b3300904813c0205f099a68f72090209010169011c21101d4b2d0e0e066b4253074c140118070a0910447556030833541d01163733816837402b3909122501183c5b1139102e2d430c662334011e27050f21621230323503332b6a0332011e1e07031843202e6e3c2850094d410c01163955220b16812d24521212011681250b0a3505460481176f011a2c09266b162968051c0a1481170116022e1e820c352037263a070201310104825d0602110303696869020484070201320204826e0201610304832203016f040232020162050642843f03048336020484540301370804833c03026c6105027a0203636165090483120201640502770304833e03017107022f0301780702470201650a04811e020167080238020168040481160102230404826b030170040483000201690304836f0302766c0304811402016b0504812e02026c6108027702016d0308827d81530604837302026e790904842602016f06048208020170060481680302320201710204812902017307048255020274320104822a02017506026803016e0a04821303017207025f0302c2b90504834a020177020483130201780604836b0402210301320604847302017a010483130202c2aa0804823c0301b9030482600301ba0104845304016c0504837e0202c3b8080484600204cf9d6379020483660202d3860704812e0203e3a4be0402560203e58784010481210204f09e95ac0102580204f5aea5890a023301016a01123428131a1f6c81445601141e227c1a7b5f1918810301182318812e17455605460d811c011a28820221311a6e12093f050a0c0120082c0b0f1362074457460c3b070d5132011c2143052a20133d160a358117591f01103136813b136e6247011c100e4c28060d16815a320a3e11070124462c03582e262d45110804113326040808070807080809090b81050708060708090607060907070b070e07070807060706070b08070f0807070709080708080c070706060808090c07060708080708080909811307070708060709080707070607070a060b070706070707080a080607060c070707080809070608080908090a812406070707070a0906070b0b0908070b07070b0607070b0608070608090b080a080f080a0608080b070b08070a080b0a810408080708080607090707080807070b070c070a070f070b080607090707080d06070b810b070607070607070b08070707070b14070a0f08070b0d08070e080b060a0a070a0707080707070709080a0a0a0e810f0907070709080a0b0707060a0707060807060a08070b08070907060807090b090a0a81140a09070706100707090a060607060e07070807070d08070a07070806070608070a070708070707080a0808090909'); +INSERT INTO t1_data VALUES(274877906947,X'00080e7f073c23110a1a18392f66090524183704276d6703306a320404824e030164080483520305c2bd7ac2bc0604815a0201360704833202016106021f020482400201630304822a0708817e8204030173040483500201640404824803016d0804824a03017709023002016606048367020268680a04815802016902088339811804027f0302656e0704834e0303d5a5370604816702036a3366090484470303c2ba660904826e02016b0904837c02016c07021403026c610604835802016d0204816802016e0104831202016f0104822f020270720602060201710704822202017206048174020273690204824602017409020c020175090482140201760a0482720301660404824403016a090484290201790404845703025d0203c2bc33040484620301bd0304824c020484540202c78607022403019a010482380202ca87070484390202d39d030485050203e184940404831b0203e6a881060483480203e8b18c0a04816d0203ee8d850104814801016b0110467257393c81272c011a053e815d3b190517064524521f011c3823590a8115372004313b1f3216011a5a20780b102d0804426916112c011a182f810781082d12137026161501221a180516811611051c131207811515173501180320112581062e05621c1407011c2d0e0617811522062208065a21520114582841621e6c203f1e2001161647411a272533815b1c2602013009048309020232630104835a0301720104817f0201330604836f0302ddb5080482560202347a07048102020135020483460104827b02043678ca800a04835f0201370404814b0104846002016103048246010482220301700204833f0201620404824d060481150201650304824f02016606088110834c0201670604821d0303c2be66010481790201680404843b030176050482270201690a04830e02016e0904844202016f040481010301630304822f020270640204822f03016e0704845802027177090482710206736ec2b2796a0104832e0306dab1d485377004048304020174050481700201750a0212020378627604048164030173080483190201790704833d0204823a02017a0506820e67030178070484530202c2b2060481500104823f020483030301b3020484310301bc04027e0402caaf0a026a0301be040482590204842e0202540202c79f0804824d0202cfa30804815a0204f29a92970204823301016c01140f63351a0a653b650d22011c09117a3e1538123537046a15043101141310082f49052f772b0c011c11121781583c2a5010133228241301287f3e0a2b1244080503060a100f413b4f0d070e2a01103e4e1f04814e7b1601183d0404052877111f230f811d01123a100f053e5c076910011a031732102381243d1b1727507301180e5d273e810803812e0f192a02013301048271070481330204821d020134080263020135060481280201610104830a0201640604826d020165060483050201670204841c0504841c0304841b0201680a04845602016a0104811c01024f030481080204813102016b0204837008024502016d0404836c04068207780301670704842302016f0404821203016d040484490301720404837e0201700104821d03048407030165050483050201720a04811602017307023502017407020503016f080484240302c2b90504821b020175090484090201770a088119822503026d6905048300020178030482680604812a0201790104830c0204833a0303d9a06806022002017a060482600203c2aa33030481560301b904020a0301bd0504820f0202d0b90904817c0202d3820202200202daa9080482030203de966e02024b0202df9d080484350204f098b0a20604845e01016d01220304456608322258060a031d4c38340f090112310c070e4238626e6601124a318109030513812f0118240d561e533742188113101b01160b24444b224d44814d4806011c05774e483410330d23541b28090401141f29062581131e221b6d011e81053a037a03320b0e4c24360d2310011a0e321d3c141825111d54637a1c0114093d3c2e58571a35293a0201350104840a03017701048330020136060217020138030483370201610a0482650201620504815e0201630704827701048201020164080483690201660804846703016904048113020167070483080201680504837d05022c0302cdb10a04815f0201690104833a0404824302026a360a04823b02016b0a04813502016d0504831a0204833803021a02026e360404825e02016f080484140201720304844b0404816603056ff09d899b0304823f020275390204816e0301780a04824202017604088308812703027902027770050482040201790104827e040482750204812902017a060483030304c2bdc2b30104836f0203c2aa62040484040301b903021c0302bd6b090484300301be0704814d0202c99402025603049a65656b090484020202ca92090482060203d19a730504844a0203d49f690804836e0202dfa8020482710204f09180860704822901016e011a0c0b8104243647521f43231f36011a2e1b33432c3d0b414905054d17011010573a6c0a816c1801160e063582340a5239050b06011a4481063d1b67250f2044200839012044591d1857291214135814101a1b361d011225067e8147111a4a4301166b13362e17195f3812186f01141c465b032b290406373301182a152a2281300f8107054e3f02023274080481770305c2bacf8168020481450201340604832f0201350704842e02013605020e0201380404841d0201610404810d020483750201620304812b020484230301610804834503026c6a0304816d0201630102380305613577337405048359020165040482720201660904826202066736f094b0af0a0482250201680104811f02016b0304847202016c0404822403016f0904822c0302c2b301025002016d0504817b01023f02016e020483090802040303e7bda10804832d02036f6b740404811402017005048419020484220202716506026303026b760904830a020172080482430304706c73620504825f02017308048413020174080481070201760104827f0204836e020477e7b89a0104840e02017a030483700206c2aa35657065050482740301b30804842b04046cc2be78090481040301b903020d0301bc010484260904813f0203c7a5620302330203c99f36050481010301a30704815b0202ca8b090483250202cdbb0604820a0202cebc0102170401380304842b0207eca2a6f29c87950904824001016f01221d17052b58101241060e3a201f1021633a0114816919811c142443100801280426080e2620042a812c531a490e121707131710011273432e493347811a340112195f671f46721c325e0118380c052b812822478107600b0116021c21821b2019263433040126021b05351b2a286b05181f071b5628111a330a012014533e073d0c0e5469141d1e2734050901220318051b44412803632e0642370e0a3a2b020131070481770201320a04812f0202346e04022b020136030483590304f09a81b60404834702016105048210020162030205030167010268020163010481540604820202048300020264310902420201650804834b02016703048247030365c6b602048205030573f098b890030481450201690204832802016a0a04826703016c0104825e02016b0604815e03016c03048334030677c2aa74c2bc09023d02016c0304823903027777060484540303df866c0104815b02016d0204811f0303796f7704020302016e0204814d07024a02016f0902680201700604840a0104831a0204835a020172070484440201730a023703026b660604830e030278790304815b0201750904822402017704025b020178030482350307f4b2a3896a343407026b0201790902720302633409020402017a020484590302dea004025f0202c2b20204816b050481200202de900402160204ee85a5770204822c0101700114143a0d391a60812d4e09011a2f313104201c372c3a3411321b011a268140144226334145050d1c4d01164e081f20671f088107237901186b123c1f6d07261e2b732e210116511116342a3d32376e083001106882257a0a17141101163039192b0c05812d735f3b01262a3e0841030b17181411051e0a18530e272b6d01182f322b260e24581d5381050f02013104048353020132050482370301690204843e02013302020d0201340104841f0201350a048139020137050482770201380204833a02016105025a0504832f0201620304836d020163050484100304832003016c030481290201640304837e020482490304822b010482290201660a04827002046964dc960204833102016c0704814502016d010482000201700104817e02037176760904821f020473eb91a708048152020174090482770201750404831e01063a825d03017a0904826a020276730a0254020177080260030277630104815c020178070481220202020301720804841202017a0204834c0202c2aa040484010301ba080482580202c6a3020481320203cdbf690502790202ce90070483140301bc030481470205d1a371cebc060481590203d2976a0404830c0203dfba6e0604814b01017101163732393b8120422f054b0e010e030b211d815d1c01165641757c080d81311d090e0112816581542d2313054301224e07121706516606080e39102d231c4b39010a2d81402d5e011a132527428114080d6e1111721c011a814a1a341538251023100d1c4c011e22182622623712411e38162a182d3b01142b67611981470f1f1f250201310a04824e0202336207048217020238730204815a0303cf886d06025a02033962620404833803016f0a04814e020161060483140302726d050483450301790904810c02036376690504811c02016403024d020165010483280802550301650904827f0304ebb8b561070482340201670302670301660804810e020168040482340201690704844d0302616404020f02016a030481060301700704827802016b070481240104814b0302c2bd0504816102016c0604837f03017a0404837902036dc2b90804810002016e0904821602016f0304812c03016401024b02017103048233060483600303e5848e04023a020172040481050305f3978aa06c070481151708070b070a0d0707070607080c080909090706080707070707070806070707070a090b070708080909090981140708070708080b0a0b0b070b070907090707070707070807080c0c070609070b0807100706070e08080a81110f06070707070f07120a0c070707070b0707060607080709080b0b080709060708070808080a810f0707060707070b070707070a080b08070e08070b0b08070c080f070a09060807070a080909080a810b080b070706070b0b0708060b07070c07070707070a0a09090b0708070a07070b0a070c070a060b080907080807070d8123070707070a0706060f070707090b07070707070b07080907080a060f070608080706070c060707070c070a810f07070706070707070a070b0713070a070707090a070c070706080a07070807080808070b0909810607080808090707080709060a070a060707070707070b080707090707060b0807'); +INSERT INTO t1_data VALUES(274877906948,X'00000e8a0330717304048359030134050481100203756371070482190201760704817b0301770804821d0201770204844d0201780204836c0404826103017504026a0202c2aa020482420301b305022c040267390602570301b9080481540301bc0102290206c99cf6b5aa80080481430202cebc02026e02048120010172011a1c2f15158108048125463f251d010811811539011412423105812181171549011847284a30234e5b33042632120118351e8113817d0f2b220d111901264f104a211004061d0a2a0b35121a0a2118341f011c81160a1b030d2a0610243e445f0c011c6f0c1e3b1768141e322717500b140110537f810169811625011a492847203e210f532c16480627020135020481780302caae0104811a020261330904846c0201620804812d0201630404814a0201650704837503017301048276020168050213020169010484540604842b0302796f0504833302016a0304831b02016b0604701302016d0604815302016e070483630204815202027071020481520201710104835b02037266700704843002027362040481490201740904817d020175020481040304f59e9c9407048218020176060484060204776dc2aa020483070201780504812503016601048159020279790704840502027a730904826c030178030482740202c2aa04023d010483540301bd06026b0203cab877010483290202cdbf060482410202cebc04025c0401690204827f04016c0904840e0202cf880104835d0203dfbe6c01025b0204f0aeb7b2030481680205f1a7b5bb390504826a010173011a22810d12415003071f81181839011a3220221511546d810012052b57011a0c4274300d154e81111f041e10011e293f4213051b2276560817312811170120092136122418370e4e782b3912080f3201262b3b340f222b0c09142a0822116a135c1c130c0114320c4e385a0d0415075f01163543340f06362381133c0c012224180981742048191d110e180e180d310f011a20632450281f043027114b034e0203316a61030482160201360104826e0201380a0484570201610104844d0504814a0201620904820f020164010481630304810403027761040258020165080481550302c9b70204827a0204677367690102660201680104831b020169020483760301720a04814502016a04020c02016b04023405023c030269630504840502016c08048463020170030482670202716d080482000201720304835c03016507024d020174030482520504821503016505048207020175040208030137060481710201760a04833d0201780404832302027a6f080481200202c2ba0204812c0301bd0404821e0205c3a66865730702540202c7890804816f0205cebcc7af730504815c0202d2930202540202db89020481160203e8b8a00304825d0205f0958db331070481620305989b8569780a04813d0204f69299a5020210010174011a7b3829100a4e511f1a281c17140114812626032c372634234c01140a520e815a810815200501123e4f3531042d57615b011a041f3e64070f1f1913274a20770114811d0f5d743e0634161c01162c2782130c1b810520280d01164a513110480b402b810d13011e522d08042c1146137012201e810512011a290903182c05301e5d811944290201390a04836d0301610104836e02016208027803036cc2bc07048261020263640a0481480301730704813602016408022b020165050484310301720702260301780402500203666d73070484470201670104825b02016a040481590304836702016c0304835601025e02016d060484110301340204813702016f04021802017006068336280201710304813507025902017201026508022903016d0604812f0201740304827e03016a010482440201750404834b02017604021a010484150504836a02057773c2b2380602520201780204823e0302cebc080484040303d2956403048171020179020484240204813c0202c2b303048307020484410301be0204816f030484250203c798680104843d03019c030482570204e19ea86a020482350302a0950a0482280204e5a4bc780304810e0101750126090a35030a03220a1731630f31252f0c4b1e31011e39200e3715282a03103b56090f6b1501121d4916246e6d460d6501162609380406361e816d203f011a22166008124f58202e182025150114390f3a25713f0e3f715c011a5a11191123466025710c313312011e3c191326811c1444055f1f5109051201143b106f1181000d068155012043381381020d81080d0603171824260a0201300404844a02013207024203026b390204833803066eeebabb35660604842102013308020302023f02013503048243020436716b66040481440201380a04843d020261690704836002016203048209030484670201630a04841d020264790104822b0201650502340302c2bd060484300201670202620201680704810d020169010484430104843402026b67040481540306eea3ad77c2aa0a04836702016c020258040482270104830a02016d0404824102036e716a0604843e02016f0104832a04020c0204836803036530650a04817402017005025b0301630604843d020171070275020273720404827002017504048133010484120301370102270201760104814f03026203016d0904844802017701048375080481220301660202330301700a04827f020378c2b2030484710202796806023c0301730704813d02017a0404815f0104817202048407010483390202c2b204026802048254040266640204831e0301b3090482230302b963060482010401750a0483290306ba35f2999dac09020f0203ca926e090483350203cdb4780302350202cebc0a020f0204d7a7696d010483100206f097bc996d71040481480101760114185b2258291610821c0e01160272173107154f5b813722011a81020c200e1826250d39811f07011a7911152a2a45131504422c81070120050d3f5b23342e3e4139032a3813042d0116592d1c15630c0c0a814649011c1a362f5c4a35511f0804033e372b01102981262a352e8205010e0b4b6282388106011e26810a2d125f361a12170d1721311e0201300204832b0201320104811b050483790201350204832202016404024c0202657a090483710202666307022703016c07048362030277750604842f0201670304843d0104844c0203686f7a07027202016a0102430204847502046ce0a2b20704810302016d0204827b02026e330804826c02016f0104835502017102027606026c020172060483490202736505048371020174030484130302387602025d02017502048345020376346b0904825c0201770904814b0303c2bd720804812b020178040483600201790804816402017a08026e0202c2b90704811c0301bd0504821e0204cdbcc7a108021a0202cfb8080481490204f09f96a50204842101017701180207232d37812d0c045c4a0a011a06163b3408171c52213a26592201206d08581605811a171e0c0a1347104914011282181324082b73320f01122f6e811d2c3d410a44011e551414206a092f133f333d150a3e0f011e235b170e37060627471b13373b3e27011a0e1e816b270c10102d53381045011a060e1e254d044932651234691e011a158138300a04810c0a8121071802013003027707048214020131080481370201320a04835502013304048271020538ceb369650802310201390a0481440202616c0502570302c7a104026c0201620804811c02016301048168020241020164040481560104820b020165080484460102400202686c060232020269670604827302016a0108810c826e0704824e02026b6c0604816902016c0304831c02016d0304811903016407022b02016e01022e0604845a030237780702040301710804815102016f0104842903017a0704826902017003048445020482080202713002024e0201720804822003016202022302017303048111010482790204812d03067479c39f66700a0210020174020229020175090484430301690604820402017606020202017a01021b0104843a0202c2b90604842b0301bd030484570202c69b0504815d0202c8a30a02240202ceb8090484690301bc0404832f0202df85020481230101780116812b0a16810e4b045a3b2a01205b1305811134092f62072343100f0f05011e5734152612030b4c4134123009361601121781653207780a6a0d01164a25210824138107738139011481341f088158060c8133010e5920193a4c2331011a0510358101231a1b3609702732011a2f07631610033436810256174c011a1342040a58110721378139101602033067750802720201320604834303017109048244020133090481700203366f79010483520201390404810902016301048411050483420201640a048432020265310704832b02026774040481000302d5b2010259020369756c0504832902016c07048365030233700904824102016d010482670404834c0504830c02016e0104831604048120030169090481750303eba6990104835f02016f0604834c030379c2ba0a0481560201700404815e06048256020174040482370201760a04820d0201770604811c02017a0404812e06020b0202c2b9030481660301bd0a04816c0301be030483620206c99b6d7777750304835b0206ceb0646b66610402490202d8bf030482250206e8bfbc626964080482510204f09c9a9e0404830f010179010e2081335661371c01220e4e2718124f0d0649812b0b0a063b040b011402741d1235810805211a011409161d732b8106325f6a01182e330325068107703728302b011e3723081c0d0a3f810c183e061b067f0106834a12011a044030185a1e810704220a0541011245602b0e421441817801144b03811a1a29614e224b02013003048139020132050485050304f09caba6010482230201350104822708048413020138020483430201610402230201620902440108812181070301300304815e020263710404831002016403048226010483660604823c020165010484510201670104816407048418030334c2b20a0481120201690404814c02016a010481500904810f02036b75610304836402016d01027902016f0304817b03056f6373cebc0a0483010201700104817d020171050482680104843b0302383203048128040807090707070b0608060707060c0b810e07080807070707060b080707070b0807090807070a070a07070808070b06090807070708080a0b81230907070b070b0707080907070706090807070807060b07060707070808070a080b0708090b0b09810a0707060908070607060609070b0a070706080a09070707070e0a0708090b0c0b09070a080a811a0706080c09070a07080b0708060806070b080c0e07090e09060706080b060a070b0607090707130b080708070b0908070a0c810d070b0706080707080b080a0a070807090708070707090709070706080709080a81170a0707070a070707070a0b0a07080d080707060a070707070b0707060f0b060707060a08070807080708810d0807070709070b070808070907080f0b070907090b0707070a0807070c0b080c0a810107070a0b07060c07080f070b09070b0906070b070b'); +INSERT INTO t1_data VALUES(274877906949,X'00000e5c033079720404826c0404833002021b03026f6b020482100201740904842e010484150303c2b36f0204840e0201760704826b02017708048273020578f48ba5b50a0481400201790904845902017a050483280304c2bac2bd0404841e0203c2aa680904843a0301bc070481100301be0304820304016a050481630202ca8103027b0202cb860604840d0204ceb56e370204832e0302bc740202520202cf8d07027e0205d8ae39c2aa0104813c0204e887b3770404816a0204f1bfb0970204832f01017a0118101e282f07045961813a193e011e69162f0d2b051c060f084460063053011e06810c20330d0733815c220515220c011210290a7e07810c3a18011a1f2f064a19155212472781047c010a123e45825501166c6062182718167131092f0112331b812c0b6e81470b01184f3a230d45261e271c36111701140a8128456b291248391a0201300104840d0204812502013401048318020137070483070201380904823b03016704026402013907023403016e060481380201610204812f0404824504045243020162050481150104824003016a0804827a020163070484590204817903017a02048209020164020484200203653077030482610302737601048424020166070481730201670304841e0504840e03016b0504825302016901048235010484400404841002016a010483680404845f02046bc2b97407023302026c7a0704812d02027161070209030378cebc0a021f020172040483750404815f0201730304813c030131020482040201740704824d0302793901027502017604048423020177040620813103048313020179030484540204833c04022503017a0904826302017a050483530203c2b2660404840f0307ba6272f397bd92010483070301be020482760202c6b9050482410203c9a3650604812c0202cbae020482180202d38c0704812f0204f096adb7070483490204f6a69c8b030484390102c2aa010c815e81147969010c811c827f0417010e81077a4c03815f010a2e8100820c010a810d148140010c0a7481201a13010c0b831525323d010a8206358129010c21637a33812701083c8340390301300504820a0304326939770404841c03016107048334030165030484150302696c0704810103016c0704812a03027178090481620301730504830e0301750504846303017802021c0301790304836803017a0604834e040135030482650302cdbf010483330304ceb23169070484090303e4849a0504817d0201b201088219744601082210832c010629846001121c8137182211816232010a81668122690108817281080110816a433581102f3e010e7481001b3481190106814e1b010e3646823a810e070301310504840b030161010481720301660604822f0301680804821003016a0704844803016b0104845b03016c0504823403026f700802340301710804826004026d3106024a03017509068458070301770a04836c04016b01021f0301790a0482790302c2b20a02270401b3040482130303ceae6e010484330302df9e040482100201b3010881656e750106820b50010e81434a27048153010a812b068122010843810c0401048211010a50817d812e010c811a8163810801061e832c010c811f81418101030163030481210301640504831102048104030482440301680a048202040271300404841303066b6576cebc6a0104843603026f7a08026d0303756a7808023e030176040483610301770704814403027973020484360302c2b906020c0401bc010484490401bd0804835c0302d38c0304846f0304eaae96750a0484020201b9010c3b824018322d010e0468315a5c817901067d583401060b810e010865118169010c0e07826b813a01066f8265010c3b8239633852010e61161e7030821b01068241210301350804843d0301620302480301690402610403e7a1910704812103016d080269030673c2bac2b36c090483070301760504821d02048454030278350702620302c2ba010483320304ca897a750804813b0401b5070482350303cebc6d050483120302d199020483020402ad660604840c0302d2a1010482550302daa30202340201ba01026d01085119826a010c2f5e82008110010882028221010481090108821b812d01068128460208810b8264010c810971812d440301310304820e0301320504825e05048221030333756d010482720301340502700301640604813d03016607020c0301690204823a03016b0104812203016c0704842103016d0304835f03016e0a04813c03016f0304834d030173060482660401710604810f0301740104843c0303d48174040482690201bc010482690108813c83290114090f816045242e148111010a810616822701048456010e2c81167a638115010a3a3b83204001067a8367010c8114127a2265010a824f7f5c230301300604833e0302616f020483560301640104827d090481280301650502150301660804841a03016804048221030169030481120301720104827803017606023d04016e020481700302c2aa0904836c0401ba090484100201bd01088240224f010843813674020a81185068620106822a44010e14154a8101825e010c19814a1b826c010c81221f81651b010a815a4d812c01082d7281160301300804843c030231300304836703013509048353030365c2bc0304814d0302667504027a0301670604831503016c09025d03016d03048178030172020483620301730104816b0402c2b30404823203017401027204016a08048451030175090237040177090481690301770302190301780a04823d03027a350a0481260302c2aa060481620401b3090481090304f098a1a30a04825d0201be010a0d730b816f010c821d81236c2b010c6f8208358119010681236801087d4e831e0108823c8235010667794b010683165e010e05812e3d3c820d010c81148123817403043531c2ba0204824c03083875c2bceba7957a03020803016302020804036dcebc0304814e0301640304843704033379790504823203016b08023603016d070481090304825804013707027a03016f080484530301710a04842203017809025e0304c2aa6135010481460401b90a04836b0401bc0704814f0306c6ab66e3afb9080482660103c39f350304821f0201b0050481110301680602030201b8040481310604810403016c0a024803017108024b0201be06048323030482650301300504812d0304f48990ae060482740103c491680a0483700301760a0481290201a7010484090202b177020482380201b3030482280102c5800602090301360104826a02018202048173040483780301370104814102018b090482730201930504810f0102c680020483790404830c020183020228020185030484400704820b02028d7a0a04821c0201920404835e02019507048437010484070301760204836102019a020214080483100303d795680504820602019e030481050201a30404820a05048436030177070484290201a50704843b0201a8060482690304816f03027735020483630202ab79050484430201b6060481050201b904024003016d070481130201bd090484350201bf06048361030163020481580102c781040484560201830604833a020286650404842a0301750a04821a020189070483370303e0b9b30904836602018c0104816c04020602021d030171050484570201960a04842d03016b0204821903016c04021e03016e0204845002019a0a04844402019d0704835103013103021702039f77750704827e0201a1090483340201a301022b0404831d0304616363750502520302cfb2040483720201a50a0481530202ad760902310201af0104811d0908816281390301640404843c0201b3080483240201bb030483480201bd040484290304840a0203bf646a0404843f03017a040482450102c89d05020f0201a1090483550201a3060483550201ab0904813203017a04024a0201ad030482210201b10204824302025d0303656577030483600202b46e010482240201b6090484410204bce39f9d020484570102c9870604813202018b0804843603017a06027102018d080481130204840c02018f0104836309026202029164020484430201930504816d0201970304843402039c6c73070483700201a0070483470201a203048262030364d7960a0484010201a80304832a060484390202a96a080481170303c69532090481440201ac040214020481180202ae770604832c0201b0090482300201b40804845a0201b5070482110302716f010482160201ba0504837b0201bb02048149030165050483250201bc07088105833002067f824d0302d19f0402330201bd04024d03017a0904814f0102ca800a048321020181040481580201820604821e020383693707048417020287630704840002018a0904834c0104835c02018b06022f02018c0704814702018d0704810a0104831a020490e7b38308048423020191020482510201920304832f030135030483710201950304833207026802019902026b02019b0904832a02019d09024c02019f0802210201a4010484080202a5710a0481680203a777670804831e0301790902100201ae0402700104834e0201af040484650202b673080484190201b705048221010483520201b808048465030167010484400104cb81cab90104834802018602048317020689777568cf920804842602018b0404817b020191050484200202a0720304833e0201a3040625827f0201a4030485080102cdb1070881408205020483700201b30404840e0202b735080482640201b80504815a0201b90a0482370206bb31cebc6c730304842f030133070483010103ce80370304826d0201900202770201ae0504844e0201b1050484080201b20904815f0201b3040483430201b40702600201b50804823b0201b90304846e0302c9a1070483300201ba0404844d0104847e0201bb050482780201bc010882378223010e811105814d8134010a8142823f2d0106811c52010a6e1814816b02088168824b010a438137812d011019060c6b812f811c010a81314e811b03033366660404825503013502048263030238620904820703016303048120040f080b0907070b07070a0907070707080a07070b0a0a81060b0707070606070f0b070b07070908070b070f0b090807080b07070707070c0e0707090d07080908080a0a50070a0707080708070706070707080a094d07070707070707070707080706070707090844070f07080c0708070708070707080a4707060609060c0b07080a07090808080737070b09060706070707070707070707094807080b0607070707060708074107080709070706070707080607060706070808070a460a0d06090709060b060707060a07070c0907060b06060b070a090707080707070b0707070c060b08070b070a09070b07070b08080706070707070807080707090d070707060707070609070a090807070d0707070b09070707070706070a0908070a0807060b0a080707090707090b08090a08070707080707070e07060708070709080b06070b0a0707070a06070606070809060a07080b07070a070c07070808070e070807070c07090607070707060707080b0743090708'); +INSERT INTO t1_data VALUES(274877906950,X'00040e1807020e0830cebc66f09f97b60604840703016b06021003016c0804835103016d0a0484050301710602560301730304822d030275770904834e0301770204824d0302797707022e0302c2b2070482640402bc6d0a025e0303c3a6370602530305cebc7768690a04823f0201be0504816f0301780a0482780201bf0a04833a0305f09e919a790a0483440103cf80340604827e0201810404823e0201830304843a0504837f0301780704834c02018407048139020186030881038372030178010231020187010481100201880204835b0204845a0104825a0201890204825c0604831802018a0704841502028c340304845e02018e0602180301390204833c0203936e770104820f0201940704823702039765630304847b020199080484110301710704821402029b650704827102019d0304845802019f0504845c0303e7ba880502690202a163090484160201a3060483020301680102470201a90a0482480201ab0104837f030482570201af050482190201b20a0481020201b30504842903026f64040483650203b873780704826d0201bb0704831c030177020481410102d0b0070482560202b17a050484460201b2040483400201b40402390202b671020484220202b777090483510201ba030481750202bb6301021e0202bc620a0484080201bd0204815d0201be060482470201bf040483340102d1800904825002028470050482290202876f06022202048872c5820104826202028b680504845d02018c0a027302018d0a0205020197090483210202986b0a02780201a3030481580201a70604835e020483670201a901048379060483780201ad0a04816b0201af010482310201b1080482020201b3060484610202b5640804814c03026e690304847c0201bb080482710201bd020482020201bf06048435010482590107d28b37c2ba61640104831702018d0704810b020393c5890204836e0201950602070305f6a5989a74040484450201970104813702029f790a04843f0202a57407027f0201a90504835b0202ab750502490202b9760a04827d0301780304826e0202bb6f060481780203bd7130050483630103d3866f09023602028a6c0604825302018c0304845302028e650404833a02028f6f0104821302039d356d090484320201a5020481130404813f0201ab0704835b0201b90a0482380201bd0904833c0201bf060484450302307604027f0102d491050483300201930a024603036bd291070483060201970704826702079b72c2b3356f730904844f02019d010482610201a10404814d0202a36b0502250203a5c7b3080483780201ab02023d0103d5a1640102260201a206026a0301660804813c0201a5030481180201a7050483360201a9040483510201aa060482020201ab0504811e0201bb090481680202bd740702160202be700304846d0102d6840a027d02068534f0988d910a0483730102d78f0404832804048462020390766601027802019202027405024b0201940a04834d020298770904815702039a6c6b0304846802049c73616e080483420201b0010481050202b565050481290206b67376c2aa640a0483280201b80704830e0102d89d0202150802720201a60602480202b073090481480201ba0204836f0102d9a50202670201b40a04822a030337c2b20a04820f0102da800604831c0201840604842802038636380804811e020188090484190201920504815402019a0304830c0201a301023d0201a6040481460201a8020484100201af0104842a0204825f0201b50304827c0201bb0804830f0105dbb878c2bc0502580107dc97e69eaf6764020259020299610104812902029d680502110202a0690a0483270203a56372030483540202a96a0204842c0205acf094abac0704821c0102dd92020483410203946d790304814f020395d7ac090228020296300404830302039b397809020a02029c770504833d0202a2700504821a0201ab010483400202b0760a04813a0201b2040483130203b3c7a10104833d0204b4e8a5a40604816f0201b90604830d0201ba090483630102de800904810a020281740a02380201880704826802018f030481670201900202790203916e710404833502019206048418020399ddba080481240202a3630a02250202b86e070481670204830d0201b90604811f0201bc070481530102df820102390201830304830102038e367901024f02039134620a0482080201920104814b020198030484790202a06b060481240201ba0802090201be08022f03023670010482170202bf6f01022d0103e0a1960304831d0302bb75060483700202a2900804817c0202a49e050485010202a6b2040482030202aa80040481720202abb30304843c0301ba0204833b0203aca677010481120206ae9f613566730504841e0202afa001020a0302a979080484060202b1a1010483730203b2a46a070482460301ba020484580203b39b610804834a0202b6a60304813b0202bfae0404837c0103e185930304845f02038889780a04826802028a85070484620301b90304826c020298a3070483270203af8962050484620202b5b7070481170202b8970602190202bd8f0a0482620103e2848f04021b0203afa861020484010301b70704824a0103e3828f05048214020284a50304812f0202909e0904824d020292b907026302049ba0336604020602029c8e0204840d0202ad860202750302a16a0802180202ae880602040202b480010483150202b7b1090483780202bdbf070482050103e480ab06020f0202889605024f020293b9030483310204968fdc93080483110202a295010484150202a69a0804844d0202a78e0a02080202aa9b0a04825f0203b2b8670402720203b5b764060482550204babacf87070481270202bd9b010481780206be9a6878696805021e0103e58bba0304821202049eab6a630a04827702029faf08024d0202a2b50a02400202a3af0704827c0203a4bd6f0504840c0202ad9d030485010202b1be040483780202b5b9060484500103e689b10404844602028abc0704811902038e98690802320203968b35090482680203979971010483060202b6a4030484050301be0a04833e0103e780a601048171020282be0304824d020286b105021b02028f960a048266020291be0804831c020299900204815502029ea70702400202a0ba040481410204a69e3870030481220202a9800602310202afb8020482170203b1af6d0802140203b5a06a0702740104e88c9a6c06048426020295bc05048326020296af0304846b02059cad72d4aa060484780205baa97364680404837b0103e983840104843902029a8a010481490203a1ac770504812c0301ba050483410202af8c0302620202b1af0302500103ea8fa60a023e020297b50904812e020298a90704825702039ea76b0304847f0202a59e080481460202a68e080482590204a9b1c6a8010481350203b38d75040482750203b89e6f0a0484030103eb828f0704824e020384837109048178020397b6690104821a02039e9e330704837f0203a68b73030484440203b980320804822c0103ec8fa80204814302039588760a04826902029bb80a024e0203afb6630802710203b4a268060483000103ed8cb50104811602029982060481550104ee8085760304834502028a870904845702028f8b04027602039da470030483040202a1a20504813c0202a8ae0504837f0202af9d0402570205b1b773d8b4080482120202bd880904832c0202be930104827b0104ef88ae680704835d0205a8ab63c2be06022e0203aaa16c080481090204adb779660804823f0202b8ae080484220203bb9165030481340106f08798b1636a0604824f0203908ea80404826203029f880402530303b4ad740a04833302039184b6090484650302acb3080483340302b1b703048272020a9281a23578f098b1893001048210030291a50404816803029d8f070483200302afa5080484440302b49f020481010303bd833603026a020393839a07024c0304a3ad6e300504842d0303abb16d0502660302adae0904830e02039481a406048164030386a16c070483530302b2a8050484320302bfb9080483170204958eb8720304832b0302b1ba090481200302babe05048209020496888b6708048358030293b4050483400304b4927a6f050483770204978b93320104810a03048fb9c7890704822803029ba702022a0302a39d060484490302a4be0a0484530302adaa0a026b0302af92040483700302b9bc0404821b02049884b56404048352030486b1716f0904827a030296b80904811d03049d9e797a060483390302a5a00a04844a0303b5856d0a04822e0302bcbd040483310303bd91740704845102039983a20a04816503039d8a330a02140303b9826b0404814e02069a8b8438687403026b0302a599010481740302a6ac0704840f0303b6896d0404831a0302b785010484370302bfac08027d02059b86b770610404845203028fbd020483550303a0be75090483620302a295040482390302b6970404813002039c97bb0a04841103059d8976c2be0604824e0302afbc05023c02039d87b40504825903028daf03048172030292be040482310302a0ab0502290303b2a16b03025d02039e929d050483040302a69f060484150302aa8607025502049f9f8b66020483160302a3be060481120203a8afad0904835e0204acb1af640204845b0204b282a47a040481610203baa68a010482490204bb9f8366060483130203bfa48f0704817c0104f18191920802220204828cad360a0482730203859c9a050481670204888eb23408025f020492ba9c3202026502049bb0bf7008021f02039f94a60104835c0203a6b496030482760203a98c960504824e0203acb7b8030483240203afa0b703023d0206b3a38c683972060483340203bbaaad0902070105f282848f790804833a020384b79f0a048170020590a98c616a0804843b02049a92be730904822f02039da18b080482530203a28f8f06048309070d06070706070807070807080b0707070b09070b07070906070f0b07080607090709070708070708080706070b070707080907070808070608080707080707070808070a0806060707070b0b07070707080807070b0d0709060b0708070707080708090808070808090b0707070707080609070d07070709060806070707070707070708070c0c08090708090a07080c070a0608070707090807090707070607070b07070a0c08070809080b08090808080808070807090a07070807070706090709070c070707070809070708060608070908080808080807090c07080809070908080909080708090807080809070908080709080707070808080807080a0808070808090a080b090a070708090808080908080909080709080708080807080a070808080a08080b0b0908090707070808080908080a0909090909090909090907080909080a0807090808070b08080a0a090a08090c090709090808100808080808080a0808090908080a08080a080a0a0a0708080708080a0a080a080908090908090b08080908070b08090808090b0709080807080908070a08090a0a090a09090a0909090909090909080c080b090b0a09'); +INSERT INTO t1_data VALUES(274877906951,X'000002020630f2abab907a060481130204b381af77040481790203bea6a6070484250108f380b5a33633737701048229020383be9f0404837102048495bf73070481060204938c9a6e0904823502039eb39201022302049fbb9f6c0a0481500204a3909e620404837d0204a9ac9a75020483110203bd8c850a048111030293ad0a048247030294b9040483550203bea4ac0702220105f483b5ab66030482440302bda306048141020584b2bb643804048142020586b1a8677a0204831d0205878c916c770804821f02038da1bf0704824302038f81bd0304825102039e91b20302420203b29b9403021f0203b3a1b10704825a0203b5afb4040481210204b98da0780a02060104f582b1b00404811002038f9fbc010482200302b8a406048419020394b7b80404834c02039bb5b005022b0203aa88b9060481390203aba48f0604842a0205af969438680602360203b88d8903026c0104f68386ad0904846702049aae8f79030483520203a8989a0604836c0203b18cb4070482260203b9a98d050483730203bebc870104824c0104f78283840804816703028db20302600303a8b46106020b020389b2a80104835002048e809339010481190205929193d0b409048253020393aebc0204816202059787b96f690704817202079b949dc78934620404817f02039db28b020483750205a288a7c7a3080482780203a5948d0204811a040b0a090e090a0a080a0a0a090808080b080b0b0b090908080909090a0908090809090a080a0a090909090a0708090a0b090b0d090b'); +CREATE TABLE IF NOT EXISTS 't1_idx'(segid, term, pgno, PRIMARY KEY(segid, term)) WITHOUT ROWID; +INSERT INTO t1_idx VALUES(2,X'',2); +INSERT INTO t1_idx VALUES(2,X'30627a',4); +INSERT INTO t1_idx VALUES(2,X'306a32',6); +INSERT INTO t1_idx VALUES(2,X'307173',8); +INSERT INTO t1_idx VALUES(2,X'307972',10); +INSERT INTO t1_idx VALUES(2,X'30cebc66',12); +INSERT INTO t1_idx VALUES(2,X'30f2ab',14); +CREATE TABLE IF NOT EXISTS 't1_content'(id INTEGER PRIMARY KEY, c0, c1,Öc2); +INSERT INTO t1_content VALUES(1,'COMPILER=gcc-5.4.0 20160609','X','RTRIM'); +INSERT INTO t1_content VALUES(2,'COMPILER=gcc-5.4.0 20160609','X','NOCASE'); +INSERT INTO t1_content VALUES(3,'COMPILER=gcc-5.4.0 20160609','X','BINARY'); +INSERT INTO t1_content VALUES(4,'DEBUG','X','RTRIM'); +INSERT INTO t1_content VALUES(5,'DEBUG','X','NOCASE'); +INSERT INTO t1_content VALUES(6,'DEBUG','X','BINARY'); +INSERT INTO t1_content VALUES(7,'ENABLE DBSTAT VTAB','X','RTRIM'); +INSERT INTO t1_content VALUES(8,'ENABLE DBSTAT VTAB','X','NOCASE'); +INSERT INTO t1_content VALUES(9,'ENABLE DBSTAT VTAB','X','BINARY'); +INSERT INTO t1_content VALUES(10,'ENABLE FTS4','X','RTRIM'); +INSERT INTO t1_content VALUES(11,'ENABLE FTS4','X','NOCASE'); +INSERT INTO t1_content VALUES(12,'ENABLE FUS4','X','BINARY'); +INSERT INTO t1_content VALUES(0,NULL,NULL,NULL); +INSERT INTO t1_content VALUES(33,'OMIT LOAD EXTENSION','X','BINARY'); +INSERT INTO t1_content VALUES(32,'OMIT LOAD EXTENSION','X','NOCASE'); +INSERT INTO t1_content VALUES(31,'OMYT LOAD EXTENSION','X','RTRIM'); +INSERT INTO t1_content VALUES(30,'MAX MEMORY=50000000','W','BINARY'); +INSERT INTO t1_content VALUES(29,'MAX MEMORY=50000000','X','NOCASE'); +INSERT INTO t1_content VALUES(28,'MAX MEMORY=50000000','X','RTRIM'); +INSERT INTO t1_content VALUES(27,'ENABLE RTREE','X','BINARY'); +INSERT INTO t1_content VALUES(26,'ENABLE RTREE','Y','NOCASE'); +INSERT INTO t1_content VALUES(25,'ENABLE RTREE','X','RTRIM'); +INSERT INTO t1_content VALUES(24,'ENABLE MEMSYS5','X','BINARY'); +INSERT INTO t1_content VALUES(23,'ENABLE MEMSYS5','X','NOCASE'); +INSERT INTO t1_content VALUES(22,'ENABLE MEMSYS5','X','RTRIM'); +INSERT INTO t1_content VALUES(21,'ENABLE JSON1','X','BINARY'); +INSERT INTO t1_content VALUES(20,'ENABLE JSON1','X','NOCASE'); +INSERT INTO t1_content VALUES(18,'ENABLE GEOPOLY','X','BINARY'); +INSERT INTO t1_content VALUES(17,'EOABLE GEOPOLY','X','NOCQSE'); +INSERT INTO t1_content VALUES(16,'ENABLE GEOPOLY','X','RTRIM'); +INSERT INTO t1_content VALUES(15,'ENABLE FTS5','X','BINARY'); +INSERT INTO t1_content VALUES(14,'ENABLE FTS5','X','NOCASE'); +CREATE TABLE IF NOT EXISTS 't1_docsize'(id INTEGER PRIMARY KEY, sz BLOB); +CREATE TABLE IF NOT EXISTS 't1_config'(k PRIMARY KEY, v) WITHOUT ROWID; +CREATE TABLE t2(x); +INSERT INTO t2 VALUES('optimize'); +INSERT INTO t2 VALUES('rebuild'); +INSERT INTO t2 VALUES('integrity-check'); +PRAGMA writable_schema=OFF; +COMMIT; +} {} + +do_catchsql_test 51.1 { + SELECT max(rowid)==0 FROM t1('e*'); +} {0 0} + +#-------------------------------------------------------------------------- +reset_db +do_test 52.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 40960 pagesize 4096 filename crash-2b92f77ddfe191.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 0a .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 0d 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 0d 0b 6e 00 0f a3 0f 4c ..........n....L +| 112: 0e e1 0e 81 0e 24 0d cc 0d 72 0d 1b 0c b0 0c 50 .....$...r.....P +| 128: 0b f8 0b b3 0b 6e 00 00 00 00 00 00 00 00 00 00 .....n.......... +| 2912: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 43 0d ..............C. +| 2928: 06 17 11 11 08 75 74 61 62 6c 65 74 34 74 34 43 .....utablet4t4C +| 2944: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 2960: 42 4c 45 20 74 34 20 55 53 49 4e 47 20 66 74 73 BLE t4 USING fts +| 2976: 35 76 6f 63 61 62 28 27 74 32 27 2c 20 27 72 6f 5vocab('t2', 'ro +| 2992: 77 27 29 43 0c 06 17 11 11 08 75 74 61 62 6c 65 w')C......utable +| 3008: 74 33 74 33 43 52 45 41 54 45 20 56 49 52 54 55 t3t3CREATE VIRTU +| 3024: 41 4c 20 54 41 42 4c 45 20 74 33 20 55 53 49 4e AL TABLE t3 USIN +| 3040: 47 20 66 74 73 35 76 6f 63 61 62 28 27 74 31 27 G fts5vocab('t1' +| 3056: 2c 20 27 72 6f 77 27 29 56 0b 06 17 1f 1f 01 7d , 'row')V....... +| 3072: 74 61 62 6c 75 74 32 5f 63 6f 6e 66 69 67 74 32 tablut2_configt2 +| 3088: 5f 63 6f 6e 66 69 67 0a 43 52 45 41 54 45 20 54 _config.CREATE T +| 3104: 41 42 4c 45 20 27 74 32 5f 63 6f 6e 66 69 67 27 ABLE 't2_config' +| 3120: 28 6b 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 (k PRIMARY KEY, +| 3136: 76 29 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 v) WITHOUT ROWID +| 3152: 5e 0a 07 17 21 21 01 81 07 74 61 62 6c 65 74 32 ^...!!...tablet2 +| 3168: 5f 63 6f 6e 74 65 6e 74 74 32 5f 63 6f 6e 74 65 _contentt2_conte +| 3184: 6e 74 09 43 52 45 41 54 45 20 54 41 42 4c 45 20 nt.CREATE TABLE +| 3200: 27 74 32 5f 63 6f 6e 74 65 6e 74 27 28 69 64 20 't2_content'(id +| 3216: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 INTEGER PRIMARY +| 3232: 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 29 KEY, c0, c1, c2) +| 3248: 69 09 07 17 19 19 01 81 2d 74 61 62 6c 65 74 32 i.......-tablet2 +| 3264: 5f 69 64 78 74 32 5f 69 64 78 08 43 52 45 41 54 _idxt2_idx.CREAT +| 3280: 45 20 54 41 42 4c 45 20 27 74 32 5f 69 64 78 27 E TABLE 't2_idx' +| 3296: 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 67 (segid, term, pg +| 3312: 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 28 no, PRIMARY KEY( +| 3328: 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 49 segid, term)) WI +| 3344: 54 48 4f 55 54 20 52 4f 57 49 44 55 08 07 17 1b THOUT ROWIDU.... +| 3360: 1b 01 81 01 74 61 62 6c 65 74 32 5f 64 61 74 61 ....tablet2_data +| 3376: 74 32 5f 64 61 74 61 07 43 52 45 41 54 45 20 54 t2_data.CREATE T +| 3392: 41 42 4c 45 20 27 74 32 5f 64 61 74 61 27 28 69 ABLE 't2_data'(i +| 3408: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 3424: 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f Y KEY, block BLO +| 3440: 42 29 58 07 07 17 11 11 08 81 1d 74 61 62 6c 65 B)X........table +| 3456: 74 32 74 32 43 52 45 41 54 45 20 56 49 52 54 55 t2t2CREATE VIRTU +| 3472: 41 4c 20 54 41 42 4c 45 20 74 32 20 55 53 49 4e AL TABLE t2 USIN +| 3488: 47 20 66 74 73 35 28 27 61 27 2c 5b 62 5d 2c 22 G fts5('a',[b],. +| 3504: 63 22 2c 64 65 74 61 69 6c 3d 6e 6f 6e 65 2c 63 c.,detail=none,c +| 3520: 6f 6c 75 6d 6e 73 69 7a 65 3d 30 29 56 06 06 17 olumnsize=0)V... +| 3536: 1f 1f 01 7d 74 61 62 6c 65 74 31 5f 63 6f 6e 66 ....tablet1_conf +| 3552: 69 67 74 31 5f 63 6f 6e 66 69 67 06 43 52 45 41 igt1_config.CREA +| 3568: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 3584: 66 69 67 27 28 6b 20 50 52 49 4d 41 52 59 20 4b fig'(k PRIMARY K +| 3600: 45 59 2c 20 76 29 20 57 49 54 48 4f 55 54 20 52 EY, v) WITHOUT R +| 3616: 4f 57 49 44 5b 05 07 17 21 21 01 81 01 74 61 62 OWID[...!!...tab +| 3632: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3648: e8 63 73 69 7a 65 05 43 52 45 41 54 45 20 54 41 .csize.CREATE TA +| 3664: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3680: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3696: 41 52 59 20 4b 45 59 2c 20 73 7a 20 42 4c 4f 42 ARY KEY, sz BLOB +| 3712: 29 5e 04 07 17 21 21 01 81 07 74 61 62 6c 65 74 )^...!!...tablet +| 3728: 31 5f 63 6f 6e 74 65 6f 74 74 31 5f 63 6f 6e 74 1_conteott1_cont +| 3744: 65 6e 74 04 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3760: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 64 't1_content'(id +| 3776: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3792: 20 4b 45 59 2c 20 63 30 2c 20 63 31 2c 20 63 32 KEY, c0, c1, c2 +| 3808: 29 69 03 07 17 19 19 01 81 2d 74 61 62 6c 65 74 )i.......-tablet +| 3824: 31 5f 69 64 78 74 31 5f 69 64 78 03 43 52 45 41 1_idxt1_idx.CREA +| 3840: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 69 64 78 TE TABLE 't1_idx +| 3856: 27 28 73 65 67 69 64 2c 20 74 65 72 6d 2c 20 70 '(segid, term, p +| 3872: 67 6e 6f 2c 20 50 52 49 4d 41 52 59 20 4b 45 59 gno, PRIMARY KEY +| 3888: 28 73 65 67 69 64 2c 20 74 65 72 6d 29 29 20 57 (segid, term)) W +| 3904: 49 54 48 4f 55 54 20 52 4f 57 49 44 55 02 07 17 ITHOUT ROWIDU... +| 3920: 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 64 61 74 .....tablet1_dat +| 3936: 61 74 31 5f 64 61 74 61 02 43 52 45 41 54 45 20 at1_data.CREATE +| 3952: 54 41 42 4c 45 20 27 74 31 5f 64 61 74 61 27 28 TABLE 't1_data'( +| 3968: 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 id INTEGER PRIMA +| 3984: 52 59 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c RY KEY, block BL +| 4000: 4f 42 29 5b 01 07 17 11 11 08 81 23 74 61 62 6c OB)[.......#tabl +| 4016: 65 74 31 74 31 43 52 45 41 54 45 20 56 49 52 54 et1t1CREATE VIRT +| 4032: 55 41 4c 20 54 41 42 4c 45 20 74 31 20 55 53 49 UAL TABLE t1 USI +| 4048: 4e 47 20 66 74 73 35 28 61 2c 62 20 75 6e 69 6e NG fts5(a,b unin +| 4064: 64 65 78 65 64 2c 63 2c 74 6f 6b 65 6e 69 7a 65 dexed,c,tokenize +| 4080: 3d 22 70 6f 72 74 65 72 20 61 73 63 69 69 22 29 =.porter ascii.) +| page 2 offset 4096 +| 0: 0d 0f 68 00 05 0f 13 00 0f e6 0f 13 0f a8 0f 7c ..h............| +| 16: 0f 2a 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .*.............. +| 3856: 00 00 00 15 0a 03 00 30 00 00 00 00 01 03 03 00 .......0........ +| 3872: 03 01 01 01 02 01 01 03 01 01 37 8c 80 80 80 80 ..........7..... +| 3888: 01 03 00 74 00 00 00 2e 02 30 61 03 02 02 01 01 ...t.....0a..... +| 3904: 62 03 02 03 01 01 63 03 02 04 01 01 67 03 08 c1 b.....c.....g... +| 3920: 02 02 01 01 68 03 06 01 02 03 01 01 69 03 06 01 ....h.......i... +| 3936: 02 04 04 06 06 06 08 08 0f ef 00 14 2a 00 00 00 ............*... +| 3952: 00 01 02 02 00 02 01 01 01 02 01 01 25 88 80 80 ............%... +| 3968: 80 80 01 03 00 50 00 00 00 1f 02 30 67 02 08 02 .....P.....0g... +| 3984: 01 02 02 01 01 68 02 08 03 01 02 03 01 01 69 02 .....h........i. +| 4000: 08 04 01 02 04 04 09 09 37 84 80 80 80 80 01 03 ........7....... +| 4016: 00 74 00 14 00 2e 02 30 61 01 02 02 01 01 62 01 .t.....0a.....b. +| 4032: 02 03 01 01 63 01 02 04 01 01 67 01 06 01 02 02 ....c.....g..... +| 4048: 01 01 68 01 06 01 02 03 01 01 69 01 06 01 02 03 ..h.......i..... +| 4064: f4 06 06 06 08 08 07 01 03 00 14 03 09 00 09 00 ................ +| 4080: 00 00 11 24 00 00 00 00 01 01 01 00 01 00 01 01 ...$............ +| page 3 offset 8192 +| 0: 0a 00 00 00 03 0f ec 00 0f fa 0f f3 0f ec 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 06 04 01 0c ................ +| 4080: 01 03 02 06 04 01 0c 01 02 02 05 04 09 0c 01 02 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 16: 00 00 00 00 01 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 5 offset 16384 +| 0: 0d 00 00 00 03 0f e8 00 0f f8 0f f0 0f e8 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 06 03 03 00 12 03 00 03 ................ +| 4080: 06 02 03 00 12 03 00 03 06 01 04 00 12 03 00 03 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 7 offset 24576 +| 0: 0d 00 00 00 03 0f 9e 00 0f e6 0f ef 0f 9e 00 00 ................ +| 3968: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 41 84 ..............A. +| 3984: 80 80 80 80 01 04 00 81 06 00 00 00 34 02 30 61 ............4.0a +| 4000: 01 01 01 01 01 62 01 01 01 01 01 63 01 01 01 01 .....b.....c.... +| 4016: 01 64 01 01 01 65 01 01 01 66 01 01 01 67 01 01 .d...e...f...g.. +| 4032: 01 01 01 68 01 01 01 01 01 69 01 01 01 04 06 06 ...h.....i...... +| 4048: 06 04 04 04 06 06 07 01 03 00 14 03 09 09 09 0f ................ +| 4064: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| 4080: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| page 8 offset 28672 +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 9 offset 32768 +| 0: 0d 00 00 00 03 0f be 00 0f ea 0f d4 0f be 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 14 03 ................ +| 4032: 05 00 17 17 17 61 20 62 20 63 67 20 68 20 69 67 .....a b cg h ig +| 4048: 20 68 20 69 14 02 05 00 17 17 17 67 20 68 20 69 h i.......g h i +| 4064: 61 20 62 20 63 67 20 68 20 69 14 01 05 00 17 17 a b cg h i...... +| 4080: 17 61 20 62 20 63 64 20 65 20 66 67 20 68 20 69 .a b cd e fg h i +| page 10 offset 36864 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| end crash-2b92f77ddfe191.db +}]} {} + +do_catchsql_test 52.1 { + SELECT fts5_decode(id, block) FROM t1_data; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 53.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename crash-dbe9b7614da103.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_configt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 63 73 !...tablet1_docs +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6b WIDU........tabk +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 10 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 31 2c 32 2c 33 ,b,prefix=.1,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e 2a ...m.K.,.......* +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0e 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cc 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 03 02 03 04 0a 19 8c 80 80 ....tab......... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 32 77 68 03 02 .....8.....2wh.. +| 2560: 04 00 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a 00 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c 65 03 02 03 07 1c 8c 80 80 80 .0table......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 00 3c 00 00 00 16 01 01 02 04 .......<........ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 74 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 th........3and.. +| 3120: 04 0a 1b 89 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 02 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 01 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 00 00 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 16 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 05 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 01 02 04 04 09 19 84 70 .......e.......p +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 01 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 03 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 02 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 01 02 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 86 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 07 ....2.......1t.. +| 3744: f4 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 03 02 08 04 01 ...0n........... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 01 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 04 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 04 09 10 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 74 .....2th......2t +| 4016: 16 07 04 09 0f 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 00 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 33 44 65 ......1......3De +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 75 ......0t......0u +| 4080: 26 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 &.....0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 08 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f 00 00 00 00 00 00 00 ................ +| 4080: 00 00 03 03 02 01 03 03 02 02 01 02 02 01 0c e9 ................ +| end crash-dbe9b7614da103.db +}]} {} + +do_catchsql_test 53.1 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x<>1 FROM c WHERE x<10) + INSERT INTO t1(a) SELECT randomblob(3000) FROM c; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 54.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename crash-03a1855566d9ae.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 06 0e 0f 00 0f aa 0f 53 ...............S +| 112: 0e e8 0e 8b 0e 33 0e 0f 00 00 00 00 00 00 00 00 .....3.......... +| 3584: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 22 ................ +| 3600: 06 06 17 11 11 01 31 74 61 62 6c 65 62 62 62 62 ......1tablebbbb +| 3616: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 62 62 .CREATE TABLE bb +| 3632: 28 61 29 56 05 06 17 1f 1f 01 7d 74 61 62 6c 65 (a)V.......table +| 3648: 74 31 5f 63 2a 6e 66 69 67 74 31 5f 63 6f 6e 66 t1_c*nfigt1_conf +| 3664: 69 67 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 ig.CREATE TABLE +| 3680: 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b 20 50 52 't1_config'(k PR +| 3696: 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 20 57 49 IMARY KEY, v) WI +| 3712: 54 48 4f 55 54 20 52 4f 57 49 44 5b 04 07 17 21 THOUT ROWID[...! +| 3728: 21 01 81 01 74 61 62 6c 65 74 31 5f 64 6f 73 73 !...tablet1_doss +| 3744: 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 04 43 52 izet1_docsize.CR +| 3760: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 64 EATE TABLE 't1_d +| 3776: 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 54 45 47 ocsize'(id INTEG +| 3792: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3808: 73 7a 20 42 4c 4f 42 29 69 03 07 17 19 19 01 81 sz BLOB)i....... +| 3824: 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 5f 69 -tablet1_idxt1_i +| 3840: 64 78 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 dx.CREATE TABLE +| 3856: 27 74 31 5f 69 64 78 27 28 73 65 67 69 64 2c 20 't1_idx'(segid, +| 3872: 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 52 49 4d term, pgno, PRIM +| 3888: 41 52 59 20 4b 45 59 28 73 65 67 69 64 2c 20 74 ARY KEY(segid, t +| 3904: 65 72 6d 29 29 20 57 49 54 48 4f 55 54 20 52 4f erm)) WITHOUT RO +| 3920: 57 49 44 55 02 07 17 1b 1b 01 81 01 74 61 62 6c WIDU........tabl +| 3936: 65 74 31 5f 64 61 74 61 74 31 5f 64 61 74 61 02 et1_datat1_data. +| 3952: 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 CREATE TABLE 't1 +| 3968: 5f 64 61 74 61 27 28 69 64 20 49 4e 54 45 47 45 _data'(id INTEGE +| 3984: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 R PRIMARY KEY, b +| 4000: 6c 6f 63 6b 20 42 4c 4f 42 29 54 01 07 17 11 11 lock BLOB)T..... +| 4016: 08 81 15 74 61 62 6c 65 74 31 74 31 43 52 45 41 ...tablet1t1CREA +| 4032: 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 4c 45 TE VIRTUAL TABLE +| 4048: 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 28 61 t1 USING fts5(a +| 4064: 2c 62 2c 70 72 65 66 69 78 3d 22 32 2c 32 2c 33 ,b,prefix=.2,2,3 +| 4080: 2c 34 22 2c 20 63 6f 6e 74 65 6e 74 3d 22 22 29 ,4., content=..) +| page 2 offset 4096 +| 0: 0d 0b 6a 00 37 09 4c 02 0f e7 09 4c 0f c6 0f a4 ..j.7.L....L.... +| 16: 0f 88 0f 6d 0f 4b 0f 2c 0f 0e 0e ec 0e cd 0e ad ...m.K.,........ +| 32: 0e 8e 0e 6c 0e 4b 0e 29 0e 08 0d e6 0d c4 0d b5 ...l.K.)........ +| 48: 0d 97 0d 76 0d 54 0d 31 0d 15 0c f3 0c d3 0c b5 ...v.T.1........ +| 64: 0c 95 0c 73 0c 54 0c 32 0c 10 0b ee 0b cd 0b b0 ...s.T.2........ +| 80: 0b 8d 0b 7e 0b 48 0b 2e 0b 0b 0a ef 0a cc 0a ad ...~.H.......... +| 96: 0a 8c 0a 6d 0a 4d 0a 2b 0a 0c 09 ec 09 ca 09 a8 ...m.M.+........ +| 112: 09 86 09 63 0f f1 00 00 00 00 00 00 00 00 00 00 ...c............ +| 2368: 00 00 00 00 00 00 00 00 00 00 00 00 15 0a 03 00 ................ +| 2384: 30 00 00 00 01 01 03 35 00 03 01 01 12 02 01 12 0......5........ +| 2400: 03 01 11 1c 8c 80 80 80 80 10 03 00 3e 00 00 00 ............>... +| 2416: 17 01 05 05 34 74 61 62 6c 03 02 03 01 04 77 68 ....4tabl.....wh +| 2432: 65 72 03 02 06 09 1b 8c 80 80 80 80 0f 03 00 3c er.............< +| 2448: 00 00 00 16 05 34 66 74 73 34 03 02 02 01 04 6e .....4fts4.....n +| 2464: 75 6d 62 03 06 01 04 09 1b 8c 80 80 80 80 0e 03 umb............. +| 2480: 00 3c 00 00 00 16 04 33 74 68 65 03 06 01 01 04 .<.....3the..... +| 2496: 01 03 77 68 65 03 02 04 04 0a 1b 8c 80 80 80 80 ..whe........... +| 2512: 0d 03 00 3c 00 00 00 16 04 33 6e 75 6d 03 06 01 ...<.....3num... +| 2528: 01 05 01 03 74 61 62 05 62 03 04 0a 19 8c 80 80 ....tab.b....... +| 2544: 80 80 0c 03 00 38 00 00 00 14 03 39 a7 68 03 02 .....8.....9.h.. +| 2560: 04 10 04 33 66 74 73 03 02 02 04 07 18 8c 80 80 ...3fts......... +| 2576: 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 03 02 .....6.....2ta.. +| 2592: 03 02 01 68 03 06 01 01 04 04 07 1b 8c 80 80 80 ...h............ +| 2608: 80 0a 03 00 3c 00 00 00 16 03 32 6e 75 03 06 01 ....<.....2nu... +| 2624: 01 05 01 02 6f 66 03 06 01 01 06 04 09 19 8c 80 ....of.......... +| 2640: 80 80 80 09 03 00 38 00 00 00 14 03 32 66 74 03 ......8.....2ft. +| 2656: 02 02 01 02 69 73 03 06 01 01 03 04 07 18 8c 80 ....is.......... +| 2672: 80 80 80 08 03 00 36 00 00 00 13 02 31 74 03 08 ......6.....1t.. +| 2688: 03 01 01 04 01 01 77 03 02 04 04 09 1a 8c 80 80 ......w......... +| 2704: 80 80 07 03 00 3a ff 00 00 15 02 31 6e 03 08 01 .....:.....1n... +| 2720: 01 02 05 01 01 6f 03 06 01 01 06 04 09 18 8c 80 .....o.......... +| 2736: 80 80 80 06 03 00 36 00 00 00 13 04 02 31 66 03 ......6......1f. +| 2752: 02 02 01 01 69 03 06 01 01 03 05 06 1c 8c 80 80 ....i........... +| 2768: 80 80 05 03 00 3e 00 00 00 17 04 30 74 68 65 03 .....>.....0the. +| 2784: 06 01 01 04 01 05 77 68 65 72 65 03 02 04 0a 15 ......where..... +| 2800: 8c 80 80 80 80 04 03 00 30 00 00 00 11 01 01 06 ........0....... +| 2816: 06 30 74 61 62 6c cc 03 02 03 07 1c 8c 80 80 80 .0tabl.......... +| 2832: 80 03 03 00 3e 00 00 00 17 07 30 6e 75 6d 62 65 ....>.....0numbe +| 2848: 72 03 06 01 01 05 01 02 6f 66 03 06 04 0d 13 8c r.......of...... +| 2864: 80 80 80 80 02 03 00 2c 00 00 00 0f 01 01 03 02 .......,........ +| 2880: 30 6e 03 06 01 01 02 07 1b 8c 80 80 80 80 01 03 0n.............. +| 2896: 00 3c 00 00 00 16 08 30 66 74 73 34 61 75 78 03 .<.....0fts4aux. +| 2912: 02 02 01 02 69 73 03 06 04 0c 00 00 00 14 2a 00 ....is........*. +| 2928: 00 00 01 01 02 24 00 02 01 01 12 02 01 12 08 88 .....$.......... +| 2944: 80 80 80 80 12 03 00 16 00 00 00 05 02 1c 88 80 ................ +| 2960: 80 80 80 11 03 00 3e 00 00 00 17 05 34 72 6f 77 ......>.....4row +| 2976: 73 02 06 01 01 05 01 04 74 68 65 72 02 02 04 0b s.......ther.... +| 2992: 15 88 80 80 80 80 10 03 00 30 00 00 00 11 02 01 .........0...... +| 3008: 01 07 05 34 62 65 74 77 02 02 04 08 1b 88 80 80 ...4betw........ +| 3024: 80 80 0f 03 00 3c 00 00 00 16 04 04 33 72 6f 77 .....<......3row +| 3040: 02 06 01 01 05 01 03 74 68 65 02 08 05 0a 1b 88 .......the...... +| 3056: 80 80 80 80 0e 03 05 0c 00 00 00 16 01 01 02 04 ................ +| 3072: 33 61 72 65 02 02 03 01 03 62 65 74 02 02 07 08 3are.....bet.... +| 3088: 1b 88 80 80 80 80 0d 03 00 3c 00 00 00 16 03 32 .........<.....2 +| 3104: 84 68 02 08 02 01 01 07 00 04 33 61 6e 64 02 06 .h........3and.. +| 3120: 04 0a 1b 88 80 80 80 80 0c 03 00 3c 00 00 00 16 ...........<.... +| 3136: 03 32 69 6e 02 06 01 01 06 01 02 72 6f 02 06 01 .2in.......ro... +| 3152: 01 05 04 09 18 88 80 80 80 80 0b 03 00 36 00 00 .............6.. +| 3168: 00 13 02 03 32 61 72 02 02 03 01 02 62 65 02 02 ....2ar.....be.. +| 3184: 04 05 07 1b 88 80 80 80 80 0a 03 00 3c 00 00 00 ............<... +| 3200: 16 02 31 74 02 08 02 01 01 07 00 03 32 61 6e 02 ..1t........2an. +| 3216: 06 01 01 04 09 19 88 80 80 80 80 09 03 00 38 00 ..............8. +| 3232: 00 00 14 02 31 6e 02 06 01 01 03 01 01 72 02 06 ....1n.......r.. +| 3248: 01 01 05 04 08 17 88 80 80 80 80 08 03 00 34 00 ..............4. +| 3264: 00 00 12 02 31 62 02 02 04 01 01 69 02 06 01 01 ....1b.....i.... +| 3280: 06 04 06 19 88 80 80 80 80 07 03 00 38 00 00 00 ............8... +| 3296: 14 04 02 31 32 02 02 05 01 01 61 02 08 03 01 01 ...12.....a..... +| 3312: 02 05 06 1b 88 80 80 80 80 06 03 00 3c 00 00 00 ............<... +| 3328: 16 06 30 74 68 65 72 65 02 12 02 00 02 31 31 02 ..0there.....11. +| 3344: 06 11 01 04 0a 15 88 80 80 80 80 05 03 00 30 00 ..............0. +| 3360: 00 00 11 01 01 05 04 30 74 68 65 02 06 01 01 07 .......0the..... +| 3376: 07 1c 88 80 80 80 80 04 03 00 3e 00 00 00 17 01 ..........>..... +| 3392: 01 06 02 30 6e 02 06 01 01 03 01 04 72 6f 77 73 ...0n.......rows +| 3408: 02 06 07 08 1b 88 80 80 80 80 03 03 00 3c 00 00 .............<.. +| 3424: 00 16 08 30 62 65 74 77 65 65 6e 02 02 04 01 02 ...0between..... +| 3440: 69 6e 02 06 04 0c 1a 88 80 80 80 80 02 03 00 3a in.............: +| 3456: 08 f0 00 15 04 30 61 6e 64 02 06 01 01 02 02 02 .....0and....... +| 3472: 72 65 02 02 03 04 0a 17 88 80 80 80 80 01 03 00 re.............. +| 3488: 34 00 00 00 12 02 30 31 02 06 01 01 04 01 01 32 4.....01.......2 +| 3504: 02 02 06 04 08 08 84 80 80 80 80 12 03 00 16 00 ................ +| 3520: 00 00 05 04 1b 84 80 80 80 80 11 03 00 3c 00 00 .............<.. +| 3536: 00 16 05 34 74 61 62 6c 01 06 01 01 05 02 03 65 ...4tabl.......e +| 3552: 72 6d 01 02 04 0b 1b 84 80 80 80 80 10 03 00 3c rm.............< +| 3568: 00 00 00 16 05 34 65 61 63 68 01 02 03 01 04 70 .....4each.....p +| 3584: 72 65 73 01 02 05 04 09 1a 84 80 80 80 80 0f 03 res............. +| 3600: 00 3a 00 00 00 15 04 33 74 65 72 01 02 04 02 02 .:.....3ter..... +| 3616: 68 65 01 06 01 01 03 04 08 1b 84 80 80 80 80 0e he.............. +| 3632: 03 00 3c 00 00 00 16 04 33 70 72 65 01 02 05 01 ..<.....3pre.... +| 3648: 03 74 61 62 01 06 01 01 05 04 08 1a 84 80 80 80 .tab............ +| 3664: 80 0d 03 00 3a 00 00 00 15 04 33 66 6f 72 01 02 ....:.....3for.. +| 3680: 02 02 02 74 73 01 06 01 01 04 04 08 1b 84 80 80 ...ts........... +| 3696: 80 80 0c 03 00 3c 00 00 00 16 03 32 74 68 01 06 .....<.....2th.. +| 3712: 01 01 03 00 04 33 65 61 63 01 02 03 04 09 18 84 .....3eac....... +| 3728: 80 80 80 80 0b 03 00 36 00 00 00 13 03 32 74 61 .......6.....2ta +| 3744: 01 06 01 01 05 02 01 65 00 02 04 04 09 19 84 80 .......e........ +| 3760: 80 80 80 0a 03 00 38 00 00 00 14 03 32 69 6e 01 ......8.....2in. +| 3776: 06 01 01 02 01 02 70 72 01 02 05 04 09 18 84 80 ......pr........ +| 3792: 80 80 80 09 03 00 36 00 00 00 13 03 32 66 6f 01 ......6.....2fo. +| 3808: 02 02 02 01 74 01 06 01 01 04 04 07 1b 84 80 80 ....t........... +| 3824: 80 80 08 03 00 3c 00 00 00 16 02 31 74 01 0a 04 .....<.....1t... +| 3840: 01 01 03 04 00 03 32 65 61 01 02 03 04 0a 17 84 ......2ea....... +| 3856: 80 80 80 80 07 03 00 34 00 00 00 12 02 31 69 01 .......4.....1i. +| 3872: 06 01 01 02 de 01 70 01 02 05 04 08 18 84 80 80 ......p......... +| 3888: 80 80 06 03 00 36 00 00 00 13 02 31 65 01 02 03 .....6.....1e... +| 3904: 01 01 66 01 08 02 01 01 04 04 06 1b 84 80 80 80 ..f............. +| 3920: 80 05 03 00 3c 00 00 00 16 05 30 74 65 72 6d 01 ....<.....0term. +| 3936: 02 04 02 02 68 65 01 06 01 01 03 04 09 14 84 80 ....he.......... +| 3952: 80 80 80 04 03 00 2e 00 00 00 10 06 30 74 61 62 ............0tab +| 3968: 6c 65 01 06 01 01 05 04 15 84 80 80 80 80 03 03 le.............. +| 3984: 00 30 00 00 00 11 02 08 30 70 72 65 73 65 6e 74 .0......0present +| 4000: 01 02 05 05 1b 84 80 80 80 80 02 03 00 3c 00 00 .............<.. +| 4016: 00 16 04 30 66 74 73 01 06 01 01 04 01 02 69 6e ...0fts.......in +| 4032: 01 06 01 01 04 0a 1a 84 80 80 80 80 01 03 00 3a ...............: +| 4048: 00 00 00 15 05 30 65 61 63 68 00 f2 03 01 03 66 .....0each.....f +| 4064: 6f 72 01 02 02 04 09 06 01 03 00 12 03 0b 0f 00 or.............. +| 4080: 00 08 8c 80 80 80 80 11 03 00 16 00 00 00 05 04 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 32 0e 4f 00 0f fa 0f f1 0f e9 0f e1 ....2.O......... +| 16: 0f d8 0f d1 0f c9 0f c1 0f b9 0f b1 0f a9 0f a0 ................ +| 32: 0f 98 0f 90 0f 87 0f 80 0f 78 0f 71 0f 68 0f 5f .........x.q.h._ +| 48: 0f 56 0f 4d 0f 41 0f 38 0f 2f 0f 26 0f 1d 0f 13 .V.M.A.8./.&.... +| 64: 0f 0a 0f 01 0e f7 0e ee 0e e6 0e dd 0e d6 0e cd ................ +| 80: 0e c3 0e ba 0e b0 0e a8 0e 9f 0e 96 0e 8e 0e 85 ................ +| 96: 0e 7c 0e 73 0e 6a 0e 60 0e 58 0e 4f 00 00 00 00 .|.s.j.`.X.O.... +| 3648: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 08 ................ +| 3664: 04 01 10 01 03 34 74 20 07 04 01 0e 01 03 34 1e .....4t ......4. +| 3680: 09 04 01 12 01 03 33 74 68 1c 08 04 01 10 01 03 ......3th....... +| 3696: 33 6e 1a 08 04 01 10 01 03 32 77 18 08 04 01 10 3n.......2w..... +| 3712: 01 03 32 74 16 08 04 01 10 01 03 32 6e 14 07 04 ..2t.......2n... +| 3728: 01 0e 01 03 32 12 08 04 01 10 01 03 31 74 10 08 ....2.......1t.. +| 3744: 04 01 10 01 03 31 6e 0e 07 04 01 0e 01 03 31 0c .....1n.......1. +| 3760: 09 04 01 12 01 03 30 74 68 0a 08 04 01 10 01 03 ......0th....... +| 3776: 30 74 08 09 04 01 12 01 03 30 6e 75 06 08 04 01 0t.......0nu.... +| 3792: 10 01 03 30 6e 04 06 04 01 0c 01 05 52 08 04 01 ...0n.......R... +| 3808: 10 01 02 34 72 22 07 04 01 0e 01 02 34 20 08 04 ...4r.......4 .. +| 3824: 01 10 01 02 33 72 1e 09 04 01 12 01 02 33 61 72 ....3r.......3ar +| 3840: 1c 08 04 01 10 01 02 32 74 1a 08 04 01 10 b3 02 .......2t....... +| 3856: 32 69 18 09 04 01 12 01 02 32 61 72 16 08 04 01 2i.......2ar.... +| 3872: 10 01 02 31 74 14 08 04 01 10 01 02 31 6e 12 08 ...1t.......1n.. +| 3888: 04 01 10 01 02 31 62 10 08 04 01 10 01 02 31 32 .....1b.......12 +| 3904: 0e 0b 04 01 16 01 02 30 74 68 65 72 0c 08 04 01 .......0ther.... +| 3920: 10 01 02 30 74 0a 08 04 01 10 01 02 30 6e 08 08 ...0t.......0n.. +| 3936: 04 01 10 01 02 30 62 06 08 04 01 10 01 02 30 61 .....0b.......0a +| 3952: 04 06 04 01 0c 01 02 02 07 04 09 10 01 34 74 22 .............4t. +| 3968: 06 04 09 0e 01 34 20 08 04 09 12 01 33 74 65 1e .....4 .....3te. +| 3984: 07 04 09 10 01 33 70 1c 07 f4 09 11 01 33 66 1a .....3p......3f. +| 4000: 08 04 09 12 01 32 74 68 18 07 04 09 10 01 32 e4 .....2th......2. +| 4016: 16 07 04 09 10 01 32 69 14 07 04 09 10 01 32 66 ......2i......2f +| 4032: 12 07 04 09 10 01 31 74 10 07 04 09 10 01 31 69 ......1t......1i +| 4048: 0e 06 04 09 0e 01 31 0c 08 04 09 12 01 30 74 65 ......1......0te +| 4064: 0a 07 04 09 10 01 30 74 08 07 04 09 10 01 30 70 ......0t......0p +| 4080: 06 08 04 09 12 01 30 66 74 04 05 04 09 0c 01 02 ......0ft....... +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0f eb 00 0f f9 0f f2 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 05 03 03 00 10 ................ +| 4080: 03 05 05 02 03 00 10 04 06 05 01 03 00 10 04 04 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 02 0f eb 00 0f eb 0f f4 00 00 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 08 03 15 01 70 ...............p +| 4080: 67 73 7a 18 0b 03 1b 01 76 65 72 73 69 6f 6e 04 gsz.....version. +| page 6 offset 20480 +| 0: 0d 00 00 00 03 0f f2 00 0f fc 0f f7 0f f2 00 00 ................ +| 4080: 00 00 23 03 02 01 03 03 02 02 01 02 02 00 f2 09 ..#............. +| end crash-03a1855566d9ae.db +}]} {} + +do_catchsql_test 54.1 { + SELECT rowid==-1 FROM t1('t*'); +} {0 {0 0 0}} + +#------------------------------------------------------------------------- +reset_db +do_test 55.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-b366b5ac0d3887.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 08 .....@ ........ +| 32: 00 00 00 02 00 00 00 05 90 00 00 09 00 00 00 04 ................ +| 96: 00 00 00 00 0d 0f c7 00 07 0d 92 00 0f 8d 0f 36 ...............6 +| 112: 0e cb 0e 6b 0e 0e 0d b6 0d 92 0d 92 00 00 00 00 ...k............ +| 3472: 00 00 22 08 06 17 11 11 01 31 74 61 62 6c 65 74 .........1tablet +| 3488: 32 74 32 08 43 52 45 41 54 45 20 54 41 42 4c 45 2t2.CREATE TABLE +| 3504: 20 74 32 28 78 29 56 07 06 17 1f 1f 01 7d 74 61 t2(x)V.......ta +| 3520: 62 6c 65 74 31 5f 63 6f 6e 66 69 67 74 31 5f 63 blet1_configt1_c +| 3536: 6f 6e 66 69 67 07 43 52 45 41 54 45 20 54 41 42 onfig.CREATE TAB +| 3552: 4c 45 20 27 74 31 5f 63 6f 6e 66 69 67 27 28 6b LE 't1_config'(k +| 3568: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 76 29 PRIMARY KEY, v) +| 3584: 20 57 49 54 48 4f 55 54 20 52 4f 57 49 44 5b 06 WITHOUT ROWID[. +| 3600: 07 17 21 21 01 81 01 74 61 62 6c 65 74 31 5f 64 ..!!...tablet1_d +| 3616: 6f 63 73 69 7a 65 74 31 5f 64 6f 63 73 69 7a 65 ocsizet1_docsize +| 3632: 06 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 74 .CREATE TABLE 't +| 3648: 31 5f 64 6f 63 73 69 7a 65 27 28 69 64 20 49 4e 1_docsize'(id IN +| 3664: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 TEGER PRIMARY KE +| 3680: 59 2c 20 73 7a 20 43 4c 4f 42 29 5e 05 07 17 21 Y, sz CLOB)^...! +| 3696: 21 01 81 07 74 61 62 6c 65 74 31 5f 63 6f 6e 74 !...tablet1_cont +| 3712: 65 6e 74 74 31 5f 63 6f 6e 74 65 6e 74 05 43 52 entt1_content.CR +| 3728: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 EATE TABLE 't1_c +| 3744: 6f 6e 74 65 6e 74 27 28 69 64 20 49 4e 54 45 47 ontent'(id INTEG +| 3760: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 ER PRIMARY KEY, +| 3776: 63 30 2c 20 63 31 2c 20 63 32 29 69 04 07 17 19 c0, c1, c2)i.... +| 3792: 19 01 81 2d 74 61 62 6c 65 74 32 5f 69 64 78 74 ...-tablet2_idxt +| 3808: 31 5f 69 64 78 04 43 52 45 41 54 45 20 54 41 42 1_idx.CREATE TAB +| 3824: 4c 45 20 27 74 31 5f 69 64 78 27 28 73 65 67 69 LE 't1_idx'(segi +| 3840: 64 2c 20 74 65 72 6d 2c 20 70 67 6e 6f 2c 20 50 d, term, pgno, P +| 3856: 52 49 4d 41 52 59 20 4b 45 59 28 73 65 67 69 64 RIMARY KEY(segid +| 3872: 2c 20 74 65 72 6d 29 29 20 57 49 54 48 4f 55 54 , term)) WITHOUT +| 3888: 20 52 4f 57 49 44 55 03 07 17 1b 1b 01 81 01 74 ROWIDU........t +| 3904: 61 62 6c 65 74 31 5f 64 61 74 61 74 31 5f 64 61 ablet1_datat1_da +| 3920: 74 61 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 ta.CREATE TABLE +| 3936: 27 74 31 5f 64 61 74 61 27 28 69 64 20 49 4e 54 't1_data'(id INT +| 3952: 45 47 45 52 20 50 52 49 4d 42 52 59 20 4b 45 59 EGER PRIMBRY KEY +| 3968: 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 38 02 06 , block BLOB)8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 35 LE t1 USING fts5 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 03 0c 94 00 0f e6 0f ef 0c 94 00 00 ................ +| 3216: 00 00 00 00 86 4a 84 80 80 80 80 01 04 00 8d 18 .....J.......... +| 3232: 00 00 03 2b 02 30 30 01 02 06 01 02 06 01 02 06 ...+.00......... +| 3248: 1f 02 03 01 02 03 01 02 03 01 08 32 30 31 36 30 ...........20160 +| 3264: 36 30 39 01 02 07 01 02 07 01 02 07 01 01 34 01 609...........4. +| 3280: 02 05 01 02 05 01 02 05 01 01 35 01 02 04 01 02 ..........5..... +| 3296: 04 01 02 04 02 07 30 30 30 30 30 30 30 1c 02 04 ......0000000... +| 3312: 01 02 04 01 02 04 01 06 62 69 6e 61 72 79 03 06 ........binary.. +| 3328: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3344: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3360: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3376: 03 06 01 02 02 03 06 01 02 02 01 08 63 6f 6d 70 ............comp +| 3392: 69 6c 65 72 01 02 02 01 02 02 f1 02 02 01 06 64 iler...........d +| 3408: 62 73 74 61 74 07 02 03 01 02 03 01 02 03 02 04 bstat........... +| 3424: 65 62 75 67 04 02 02 01 02 02 01 02 02 01 06 65 ebug...........e +| 3440: 6e 61 62 6c 65 07 02 02 01 02 02 01 02 02 01 02 nable........... +| 3456: 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 ................ +| 3472: 01 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 ................ +| 3488: 02 02 01 02 02 01 02 02 01 02 02 01 02 02 01 02 ................ +| 3504: 02 01 02 02 02 08 78 74 65 6e 73 69 6f 6e 1f 02 ......xtension.. +| 3520: 04 01 02 04 01 02 04 01 04 66 74 73 34 0a 02 03 .........fts4... +| 3536: 01 02 03 01 02 03 04 01 35 0d 02 03 01 02 03 01 ........5....... +| 3552: 02 03 01 03 67 63 63 01 02 03 01 02 03 01 02 03 ....gcc......... +| 3568: 02 06 65 6f 70 6f 6c 79 10 02 03 01 02 03 01 02 ..eopoly........ +| 3584: 03 01 05 6a 73 6f 6e 31 13 02 03 01 02 03 01 02 ...json1........ +| 3600: 03 01 04 6c 6f 61 64 1f 02 03 01 02 03 01 02 03 ...load......... +| 3616: 01 03 6d 61 78 1c 02 02 01 02 02 01 02 02 02 05 ..max........... +| 3632: 65 6d 6f 72 79 1c 02 03 01 02 03 01 02 03 04 04 emory........... +| 3648: 73 79 73 35 16 02 03 01 02 03 01 02 03 01 06 6e sys5...........n +| 3664: 6f 63 61 73 65 02 06 01 02 02 03 06 01 02 02 03 ocase........... +| 3680: 06 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 ................ +| 3696: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3712: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3728: 02 01 04 6f 6d 69 74 1f 02 02 01 02 02 01 02 02 ...omit......... +| 3744: 01 05 72 74 72 65 65 19 02 03 01 02 03 01 02 03 ..rtree......... +| 3760: 04 02 69 6d 01 06 01 02 02 03 06 01 02 02 03 06 ..im............ +| 3776: 01 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 ................ +| 3792: 02 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 ................ +| 3808: 02 03 06 01 02 02 03 06 01 02 02 03 06 01 02 02 ................ +| 3824: 01 0a 74 68 72 65 61 64 73 61 66 65 22 02 02 01 ..threadsafe.... +| 3840: 02 02 01 02 02 01 04 76 74 61 62 07 02 04 01 02 .......vtab..... +| 3856: 04 01 02 04 01 01 78 01 06 01 01 02 01 06 01 01 ......x......... +| 3872: 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 ................ +| 3888: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3904: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 3920: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 3936: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 3952: 02 01 06 01 01 02 01 06 01 01 02 08 d6 01 01 02 ................ +| 3968: 01 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 ................ +| 3984: 06 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 ................ +| 4000: 01 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 ................ +| 4016: 01 02 01 06 01 01 02 01 06 01 01 02 01 06 01 01 ................ +| 4032: 02 01 06 01 01 02 01 06 01 01 02 04 15 13 0c 0c ................ +| 4048: 12 44 13 11 0f 47 13 0f 0c 0e 11 10 0f 0e 10 0f .D...G.......... +| 4064: 44 0f 10 40 15 0f 07 01 03 00 14 24 5a 24 24 0f D..@.......$Z$$. +| 4080: 0a 03 00 24 00 00 00 00 01 01 01 00 01 01 01 01 ...$............ +| page 4 offset 12288 +| 0: 0a 00 00 00 01 0f fa 00 0f fa 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 05 04 09 0c 01 02 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 24 0c 0a 00 0f d8 0f af 0f 86 0f 74 ....$..........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 00 00 00 00 .......x.W.>.... +| 3072: 00 00 00 00 00 00 00 00 00 00 18 24 05 00 25 0f ...........$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 20 f5 00 33 0f 19 4f 4d 0XRTRIM. ..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4c 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 LAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 30 45 4e 41 42 INARY....%.0ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4f 41 42 4c 45 20 46 54 53 35 58 .#..EOABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 31 42 58 42 49 4e 41 52 59 1e TAT VT1BXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 15 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 42 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XBTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 6 offset 20480 +| 0: 0d 00 00 00 24 0e e0 00 0f f8 0f f0 0f e8 0f e0 ....$........... +| 16: 0f d8 0f d0 0f c8 0f c0 0f b8 0f b0 0f a8 0f a0 ................ +| 32: 0f 98 0f 90 0f 88 0f 80 0f 78 0f 70 1f 68 0f 60 .........x.p.h.` +| 48: 0f 58 0f 50 0f 48 0f 40 0f 38 0f 30 0f 28 0f 20 .X.P.H.@.8.0.(. +| 64: 0f 18 0f 10 0f 08 0f 00 0e f8 0e f0 0e e8 0e e0 ................ +| 3808: 07 24 03 00 12 02 01 01 06 23 03 00 12 02 01 01 .$.......#...... +| 3824: 06 22 03 00 12 02 01 01 06 21 03 00 12 03 01 01 .........!...... +| 3840: 06 20 03 00 12 03 01 01 06 1f 03 00 12 03 01 01 . .............. +| 3856: 06 1e 03 00 12 03 01 01 06 1d 03 00 12 03 01 01 ................ +| 3872: 06 1c 03 00 12 03 01 01 06 1b 03 00 12 02 01 01 ................ +| 3888: 06 1a 03 00 12 02 01 01 06 19 03 00 12 02 01 01 ................ +| 3904: 06 18 03 00 12 02 01 01 06 17 03 00 12 02 01 01 ................ +| 3920: 06 16 03 00 12 02 01 01 06 15 03 00 12 02 01 01 ................ +| 3936: 06 14 03 00 12 02 01 01 06 13 03 00 12 02 01 01 ................ +| 3952: 06 12 03 00 12 02 01 01 06 11 03 00 12 02 01 01 ................ +| 3968: 06 10 03 00 12 02 01 01 06 0f 03 00 12 02 01 01 ................ +| 3984: 06 0e 03 00 12 02 01 01 06 0d 03 00 12 02 01 01 ................ +| 4000: 06 0c 03 00 12 02 01 01 06 0b 03 00 12 02 01 01 ................ +| 4016: 06 0a 03 00 12 02 01 01 05 09 03 00 12 03 01 01 ................ +| 4032: 06 08 03 00 12 03 01 01 01 17 03 00 12 03 01 01 ................ +| 4048: 06 06 03 00 12 01 01 01 06 05 03 00 12 01 01 01 ................ +| 4064: 06 04 03 00 12 01 01 01 06 03 02 f0 12 06 01 01 ................ +| 4080: 06 02 03 00 13 06 01 01 06 01 03 00 12 06 01 01 ................ +| page 7 offset 24576 +| 0: 0a 00 00 00 01 0f f4 00 0f f4 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 0b 03 1b 01 76 65 72 73 69 6f 6e 04 ........version. +| page 8 offset 28672 +| 0: 0d 00 00 00 03 0f d6 00 0f f4 0f e9 0f d6 00 00 ................ +| 4048: 00 00 00 00 00 00 11 03 02 2b 69 6e 74 65 77 72 .........+intewr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-b366b5ac0d3887.db +}]} {} + +do_execsql_test 55.1 { + SAVEPOINT one; + DELETE FROM t1 WHERE a MATCH 'ts'; +} + +do_execsql_test 55.2 { + ROLLBACK TO one; +} + sqlite3_fts5_may_be_corrupt 0 finish_test + diff --git a/ext/fts5/test/fts5interrupt.test b/ext/fts5/test/fts5interrupt.test new file mode 100644 index 0000000..ca68285 --- /dev/null +++ b/ext/fts5/test/fts5interrupt.test @@ -0,0 +1,67 @@ +# 2019 Jan 4 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# This file implements regression tests for SQLite library. The +# focus of this script is testing the FTS5 module. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5interrupt + +# If SQLITE_ENABLE_FTS5 is not defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE t1 USING fts5(a); + INSERT INTO t1(t1, rank) VALUES('pgsz', 40); +} +db_save_and_close + +proc progress_handler {args} { + incr ::progress_handler_delay -1 + if {$::progress_handler_delay<=0} { return 1 } + return 0 +} + +foreach {tn sql} { + 1 { INSERT INTO t1(rowid, a) VALUES(0, 'z z z z') } + 2 { COMMIT } +} { + set bDone 0 + for {set i 1} {$bDone==0} {incr i} { + do_test 1.$tn.$i { + db_restore_and_reopen + execsql { + BEGIN; + INSERT INTO t1(rowid, a) VALUES(1, 'a b c d'); + INSERT INTO t1(rowid, a) VALUES(2, 'd e f g'); + INSERT INTO t1(rowid, a) VALUES(3, 'h i j k'); + INSERT INTO t1(rowid, a) VALUES(4, 'l m n o'); + } + + set ::progress_handler_delay $i + db progress 1 progress_handler + set res [catchsql $sql] + db close + if {$res=="0 {}"} { + set bDone 1 + } else { + if {$res!="1 interrupted"} { error "got: $res" } + } + set {} {} + } {} + } +} + +finish_test + diff --git a/ext/fts5/test/fts5tokenizer.test b/ext/fts5/test/fts5tokenizer.test index e71979e..2737065 100644 --- a/ext/fts5/test/fts5tokenizer.test +++ b/ext/fts5/test/fts5tokenizer.test @@ -189,7 +189,7 @@ do_catchsql_test 6.2 { } {1 {error in tokenizer constructor}} do_catchsql_test 6.3 { CREATE VIRTUAL TABLE a3 USING fts5( - x, y, tokenize = 'unicode61 remove_diacritics 2' + x, y, tokenize = 'unicode61 remove_diacritics 3' ); } {1 {error in tokenizer constructor}} do_catchsql_test 6.4 { diff --git a/ext/fts5/test/fts5umlaut.test b/ext/fts5/test/fts5umlaut.test new file mode 100644 index 0000000..fa94810 --- /dev/null +++ b/ext/fts5/test/fts5umlaut.test @@ -0,0 +1,65 @@ +# 2014 June 17 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# This file implements regression tests for SQLite library. The +# focus of this script is testing the FTS5 module. +# + +source [file join [file dirname [info script]] fts5_common.tcl] +set testprefix fts5umlaut + +# If SQLITE_ENABLE_FTS5 is not defined, omit this file. +ifcapable !fts5 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE t1 USING fts5(x); + CREATE VIRTUAL TABLE t2 USING fts5( + x, + tokenize="unicode61 remove_diacritics 2" + ); +} + +foreach {tn q res1 res2} { + 1 "Hà Nội" 0 1 + 2 "Hà Noi" 1 1 + 3 "Ha Noi" 1 1 + 4 "Ha N\u1ed9i" 0 1 + 5 "Ha N\u006fi" 1 1 + 6 "Ha N\u006f\u0302i" 1 1 + 7 "Ha N\u006f\u0323\u0302i" 1 1 +} { + do_execsql_test 1.$tn.1 { + DELETE FROM t1; + INSERT INTO t1(rowid, x) VALUES (1, 'Ha Noi'); + SELECT count(*) FROM t1($q) + } $res1 + do_execsql_test 1.$tn.2 { + DELETE FROM t1; + INSERT INTO t1(rowid, x) VALUES (1, $q); + SELECT count(*) FROM t1('Ha Noi') + } $res1 + + do_execsql_test 1.$tn.2 { + DELETE FROM t2; + INSERT INTO t2(rowid, x) VALUES (1, 'Ha Noi'); + SELECT count(*) FROM t2($q) + } $res2 + do_execsql_test 1.$tn.2 { + DELETE FROM t2; + INSERT INTO t2(rowid, x) VALUES (1, $q); + SELECT count(*) FROM t2('Ha Noi') + } $res2 +} + +finish_test + diff --git a/ext/fts5/test/fts5unicode3.test b/ext/fts5/test/fts5unicode3.test index 99f9c8c..30eb3c4 100644 --- a/ext/fts5/test/fts5unicode3.test +++ b/ext/fts5/test/fts5unicode3.test @@ -21,7 +21,7 @@ ifcapable !fts5 { } proc fts3_unicode_path {file} { - file join [file dirname [info script]] .. .. fts3 unicode $file + file join .. [file dirname [info script]] .. .. fts3 unicode $file } source [fts3_unicode_path parseunicode.tcl] @@ -36,24 +36,26 @@ foreach x [an_load_unicodedata_text $UD] { } foreach {y} [rd_load_unicodedata_text $UD] { - foreach {code ascii} $y {} + foreach {code ascii f} $y {} if {$ascii==""} { set int 0 } else { binary scan $ascii c int } - set aDiacritic($code) $int + set aDiacritic($code,$f) $int + if {$f==0} { set aDiacritic($code,1) $int } } proc tcl_fold {i {bRemoveDiacritic 0}} { global tl_lookup_table global aDiacritic + set f [expr $bRemoveDiacritic==2] if {[info exists tl_lookup_table($i)]} { set i $tl_lookup_table($i) } - if {$bRemoveDiacritic && [info exists aDiacritic($i)]} { - set i $aDiacritic($i) + if {$bRemoveDiacritic && [info exists aDiacritic($i,$f)]} { + set i $aDiacritic($i,$f) } expr $i } @@ -85,7 +87,7 @@ do_execsql_test 1.1 { SELECT count(*), min(i) FROM ii WHERE fts5_fold(i)!=CAST(tcl_fold(i) AS int); } {0 {}} -do_execsql_test 1.2 { +do_execsql_test 1.2.1 { WITH ii(i) AS ( SELECT -1 UNION ALL @@ -95,6 +97,16 @@ do_execsql_test 1.2 { WHERE fts5_fold(i,1)!=CAST(tcl_fold(i,1) AS int); } {0 {}} +do_execsql_test 1.2.2 { + WITH ii(i) AS ( + SELECT -1 + UNION ALL + SELECT i+1 FROM ii WHERE i<100000 + ) + SELECT count(*), min(i) FROM ii + WHERE fts5_fold(i,2)!=CAST(tcl_fold(i,2) AS int); +} {0 {}} + do_execsql_test 1.3 { WITH ii(i) AS ( SELECT -1 diff --git a/ext/fts5/test/fts5update.test b/ext/fts5/test/fts5update.test index b558c2f..75598b4 100644 --- a/ext/fts5/test/fts5update.test +++ b/ext/fts5/test/fts5update.test @@ -115,5 +115,43 @@ do_execsql_test 2.2.integrity { INSERT INTO x2(x2) VALUES('integrity-check'); } +#------------------------------------------------------------------------- +# +do_execsql_test 3.0 { + CREATE VIRTUAL TABLE x3 USING fts5(x, detail=%DETAIL%); + INSERT INTO x3 VALUES('one'); + INSERT INTO x3 VALUES('two'); + INSERT INTO x3 VALUES('one'); + INSERT INTO x3 VALUES('two'); + INSERT INTO x3 VALUES('one'); } + +do_test 3.1 { + db eval { SELECT * FROM x3('one') } { + db eval { + INSERT INTO x3(x3) VALUES('optimize'); + } + } +} {} + +do_execsql_test 4.0 { + CREATE VIRTUAL TABLE x4 USING fts5(a, detail=%DETAIL%); + INSERT INTO x4 VALUES('one two three'); + INSERT INTO x4(rowid, a) VALUES('2', 'one two three'); + INSERT INTO x4(rowid, a) VALUES('3.0', 'one two three'); +} +do_catchsql_test 4.1 { + INSERT INTO x4(rowid, a) VALUES('four', 'one two three'); +} {1 {datatype mismatch}} + +do_catchsql_test 4.2 { + UPDATE x4 SET rowid = 'four' WHERE rowid=1; +} {1 {datatype mismatch}} + + +} + +reset_db +do_catchsql_test 4.0 { CREATE VIRTUAL TABLE t1 USING fts5(a,b,c); } {0 {}} +do_catchsql_test 4.1 { DELETE FROM t1 WHERE t1 MATCH 'f*'; } {0 {}} finish_test diff --git a/ext/fts5/test/fts5vocab.test b/ext/fts5/test/fts5vocab.test index d3c8b76..a1bf2a4 100644 --- a/ext/fts5/test/fts5vocab.test +++ b/ext/fts5/test/fts5vocab.test @@ -79,8 +79,8 @@ do_execsql_test 1.1.2 { 3 cnt {} 0 {} 0 } -do_execsql_test 1.2.1 { SELECT * FROM v1 } { } -do_execsql_test 1.2.2 { SELECT * FROM v2 } { } +do_execsql_test 1.2.1 { SELECT * FROM v1 } {} +do_execsql_test 1.2.2 { SELECT * FROM v2 } {} do_execsql_test 1.3 { INSERT INTO t1 VALUES('x y z'); @@ -479,6 +479,68 @@ do_test 9.6 { expr [lsearch $e2 SorterSort]<0 } 0 +#------------------------------------------------------------------------- +do_execsql_test 10.0 { + CREATE VIRTUAL TABLE ft USING fts5(a, b, c); + CREATE VIRTUAL TABLE t2 USING fts5vocab('ft','row'); + CREATE VIRTUAL TABLE t3 USING fts5vocab('ft','row'); +} +do_execsql_test 10.1 { + BEGIN; + INSERT INTO ft(b) VALUES('x y'); +} + +do_execsql_test 10.2 { + SELECT t2.term FROM t2; +} {x y} + +do_execsql_test 10.3 { + SELECT t2.term, t3.term FROM t2, t3; +} {x x x y y x y y} + +do_execsql_test 10.4 { + COMMIT; +} + +do_execsql_test 10.5 { + BEGIN; + INSERT INTO ft(a) VALUES('1 2 3'); + INSERT INTO ft(a) VALUES('4 5 6'); + INSERT INTO ft(a) VALUES('1 2 3'); + INSERT INTO ft(a) VALUES('4 5 6'); + INSERT INTO ft(a) VALUES('1 2 3'); + INSERT INTO ft(a) VALUES('4 5 6'); +} + +do_test 10.6 { + set res [list] + db eval { SELECT rowid FROM ft('4') } x { + db eval { SELECT * FROM t2 } + lappend res $x(rowid) + } + db eval COMMIT + set res +} {3 5 7} + +do_execsql_test 10.6.1 { + SELECT * FROM t2 WHERE termNULL; +} +do_execsql_test 10.6.3 { + SELECT * FROM t2 WHERE term=NULL; +} +do_execsql_test 10.7.1 { + SELECT * FROM t2 WHERE term?; +} +do_execsql_test 10.7.3 { + SELECT * FROM t2 WHERE term=?; +} finish_test + diff --git a/ext/fts5/test/fts5vocab2.test b/ext/fts5/test/fts5vocab2.test index 8edea54..45d6571 100644 --- a/ext/fts5/test/fts5vocab2.test +++ b/ext/fts5/test/fts5vocab2.test @@ -80,8 +80,7 @@ do_execsql_test 1.4 { do_execsql_test 1.5 { DELETE FROM t1; SELECT * FROM v1; -} { -} +} {} #------------------------------------------------------------------------- # @@ -143,8 +142,7 @@ do_execsql_test 2.4 { do_execsql_test 2.5 { DELETE FROM t1; SELECT * FROM v1; -} { -} +} {} #------------------------------------------------------------------------- # @@ -202,7 +200,38 @@ do_execsql_test 3.4 { do_execsql_test 3.5 { DELETE FROM t1; SELECT * FROM v1; -} { +} {} + +#------------------------------------------------------------------------- +# +reset_db +do_execsql_test 4.0 { + CREATE VIRTUAL TABLE v1 USING fts5vocab(nosuchtable, col); +} + +do_catchsql_test 4.1 { + SELECT * FROM v1 WHERE term=='nosuchterm'; +} {1 {no such fts5 table: main.nosuchtable}} + +do_execsql_test 4.2.1 { + CREATE TABLE nosuchtable(nosuchtable, y, z); +} +do_catchsql_test 4.2.2 { + SELECT * FROM v1 WHERE term=='nosuchterm'; +} {1 {no such fts5 table: main.nosuchtable}} + +ifcapable fts3 { + do_execsql_test 4.3.1 { + DROP TABLE nosuchtable; + CREATE VIRTUAL TABLE nosuchtable USING fts3(a, b); + } {} + do_catchsql_test 4.3.2 { + SELECT * FROM v1 WHERE term=='nosuchterm'; + } {1 {no such fts5 table: main.nosuchtable}} + do_catchsql_test 4.3.3 { + INSERT INTO nosuchtable VALUES('id', '*id'); + SELECT * FROM v1 WHERE term=='nosuchterm'; + } {1 {no such fts5 table: main.nosuchtable}} } finish_test diff --git a/ext/misc/amatch.c b/ext/misc/amatch.c index 142e354..7d96ed5 100644 --- a/ext/misc/amatch.c +++ b/ext/misc/amatch.c @@ -619,7 +619,7 @@ static int amatchLoadOneRule( if( p->rDel==0 || p->rDel>rCost ) p->rDel = rCost; }else { - pRule = sqlite3_malloc( sizeof(*pRule) + nFrom + nTo ); + pRule = sqlite3_malloc64( sizeof(*pRule) + nFrom + nTo ); if( pRule==0 ){ rc = SQLITE_NOMEM; }else{ @@ -738,11 +738,11 @@ static int amatchLoadRules( ** `mno` becomes mno */ static char *amatchDequote(const char *zIn){ - int nIn; /* Size of input string, in bytes */ + sqlite3_int64 nIn; /* Size of input string, in bytes */ char *zOut; /* Output (dequoted) string */ - nIn = (int)strlen(zIn); - zOut = sqlite3_malloc(nIn+1); + nIn = strlen(zIn); + zOut = sqlite3_malloc64(nIn+1); if( zOut ){ char q = zIn[0]; /* Quote character (if any ) */ @@ -1069,7 +1069,7 @@ static void amatchAddWord( } return; } - pWord = sqlite3_malloc( sizeof(*pWord) + nBase + nTail - 1 ); + pWord = sqlite3_malloc64( sizeof(*pWord) + nBase + nTail - 1 ); if( pWord==0 ) return; memset(pWord, 0, sizeof(*pWord)); pWord->rCost = rCost; diff --git a/ext/misc/closure.c b/ext/misc/closure.c index 03f13c0..2f83198 100644 --- a/ext/misc/closure.c +++ b/ext/misc/closure.c @@ -422,11 +422,11 @@ static closure_avl *queuePull(closure_queue *pQueue){ ** `mno` becomes mno */ static char *closureDequote(const char *zIn){ - int nIn; /* Size of input string, in bytes */ + sqlite3_int64 nIn; /* Size of input string, in bytes */ char *zOut; /* Output (dequoted) string */ - nIn = (int)strlen(zIn); - zOut = sqlite3_malloc(nIn+1); + nIn = strlen(zIn); + zOut = sqlite3_malloc64(nIn+1); if( zOut ){ char q = zIn[0]; /* Quote character (if any ) */ diff --git a/ext/misc/csv.c b/ext/misc/csv.c index 8cca8ae..09e970e 100644 --- a/ext/misc/csv.c +++ b/ext/misc/csv.c @@ -621,7 +621,7 @@ static int csvtabConnect( }else if( pNew->zData ){ pNew->iStart = (int)sRdr.iIn; }else{ - pNew->iStart = ftell(sRdr.in); + pNew->iStart = (int)(ftell(sRdr.in) - sRdr.nIn + sRdr.iIn); } csv_reader_reset(&sRdr); rc = sqlite3_declare_vtab(db, CSV_SCHEMA); diff --git a/ext/misc/dbdump.c b/ext/misc/dbdump.c index 0b4b4bf..157e646 100644 --- a/ext/misc/dbdump.c +++ b/ext/misc/dbdump.c @@ -195,7 +195,7 @@ static char **tableColumnList(DState *p, const char *zTab){ if( nCol>=nAlloc-2 ){ char **azNew; nAlloc = nAlloc*2 + nCol + 10; - azNew = sqlite3_realloc(azCol, nAlloc*sizeof(azCol[0])); + azNew = sqlite3_realloc64(azCol, nAlloc*sizeof(azCol[0])); if( azNew==0 ) goto col_oom; azCol = azNew; azCol[0] = 0; diff --git a/ext/misc/eval.c b/ext/misc/eval.c index e90bfc0..fd27ed6 100644 --- a/ext/misc/eval.c +++ b/ext/misc/eval.c @@ -44,7 +44,7 @@ static int callback(void *pCtx, int argc, char **argv, char **colnames){ /* Using sqlite3_realloc64() would be better, but it is a recent ** addition and will cause a segfault if loaded by an older version ** of SQLite. */ - zNew = p->nAlloc<=0x7fffffff ? sqlite3_realloc(p->z, (int)p->nAlloc) : 0; + zNew = p->nAlloc<=0x7fffffff ? sqlite3_realloc64(p->z, p->nAlloc) : 0; if( zNew==0 ){ sqlite3_free(p->z); memset(p, 0, sizeof(*p)); diff --git a/ext/misc/fileio.c b/ext/misc/fileio.c index 3a4fa18..b15e0fd 100644 --- a/ext/misc/fileio.c +++ b/ext/misc/fileio.c @@ -121,22 +121,47 @@ SQLITE_EXTENSION_INIT1 /* ** Set the result stored by context ctx to a blob containing the -** contents of file zName. +** contents of file zName. Or, leave the result unchanged (NULL) +** if the file does not exist or is unreadable. +** +** If the file exceeds the SQLite blob size limit, through an +** SQLITE_TOOBIG error. +** +** Throw an SQLITE_IOERR if there are difficulties pulling the file +** off of disk. */ static void readFileContents(sqlite3_context *ctx, const char *zName){ FILE *in; - long nIn; + sqlite3_int64 nIn; void *pBuf; + sqlite3 *db; + int mxBlob; in = fopen(zName, "rb"); - if( in==0 ) return; + if( in==0 ){ + /* File does not exist or is unreadable. Leave the result set to NULL. */ + return; + } fseek(in, 0, SEEK_END); nIn = ftell(in); rewind(in); - pBuf = sqlite3_malloc( nIn ); - if( pBuf && 1==fread(pBuf, nIn, 1, in) ){ - sqlite3_result_blob(ctx, pBuf, nIn, sqlite3_free); + db = sqlite3_context_db_handle(ctx); + mxBlob = sqlite3_limit(db, SQLITE_LIMIT_LENGTH, -1); + if( nIn>mxBlob ){ + sqlite3_result_error_code(ctx, SQLITE_TOOBIG); + fclose(in); + return; + } + pBuf = sqlite3_malloc64( nIn ); + if( pBuf==0 ){ + sqlite3_result_error_nomem(ctx); + fclose(in); + return; + } + if( 1==fread(pBuf, nIn, 1, in) ){ + sqlite3_result_blob64(ctx, pBuf, nIn, sqlite3_free); }else{ + sqlite3_result_error_code(ctx, SQLITE_IOERR); sqlite3_free(pBuf); } fclose(in); @@ -646,8 +671,8 @@ static int fsdirNext(sqlite3_vtab_cursor *cur){ FsdirLevel *pLvl; if( iNew>=pCur->nLvl ){ int nNew = iNew+1; - int nByte = nNew*sizeof(FsdirLevel); - FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc(pCur->aLvl, nByte); + sqlite3_int64 nByte = nNew*sizeof(FsdirLevel); + FsdirLevel *aNew = (FsdirLevel*)sqlite3_realloc64(pCur->aLvl, nByte); if( aNew==0 ) return SQLITE_NOMEM; memset(&aNew[pCur->nLvl], 0, sizeof(FsdirLevel)*(nNew-pCur->nLvl)); pCur->aLvl = aNew; @@ -727,7 +752,7 @@ static int fsdirColumn( }else if( S_ISLNK(m) ){ char aStatic[64]; char *aBuf = aStatic; - int nBuf = 64; + sqlite3_int64 nBuf = 64; int n; while( 1 ){ @@ -735,7 +760,7 @@ static int fsdirColumn( if( nzBasis = (char*)&pNew[1]; diff --git a/ext/misc/json1.c b/ext/misc/json1.c index a5b4549..d99d360 100644 --- a/ext/misc/json1.c +++ b/ext/misc/json1.c @@ -691,7 +691,7 @@ static JSON_NOINLINE int jsonParseAddNodeExpand( assert( pParse->nNode>=pParse->nAlloc ); if( pParse->oom ) return -1; nNew = pParse->nAlloc*2 + 10; - pNew = sqlite3_realloc(pParse->aNode, sizeof(JsonNode)*nNew); + pNew = sqlite3_realloc64(pParse->aNode, sizeof(JsonNode)*nNew); if( pNew==0 ){ pParse->oom = 1; return -1; @@ -965,7 +965,7 @@ static void jsonParseFillInParentage(JsonParse *pParse, u32 i, u32 iParent){ static int jsonParseFindParents(JsonParse *pParse){ u32 *aUp; assert( pParse->aUp==0 ); - aUp = pParse->aUp = sqlite3_malloc( sizeof(u32)*pParse->nNode ); + aUp = pParse->aUp = sqlite3_malloc64( sizeof(u32)*pParse->nNode ); if( aUp==0 ){ pParse->oom = 1; return SQLITE_NOMEM; @@ -1027,7 +1027,7 @@ static JsonParse *jsonParseCached( pMatch->iHold = iMaxHold+1; return pMatch; } - p = sqlite3_malloc( sizeof(*p) + nJson + 1 ); + p = sqlite3_malloc64( sizeof(*p) + nJson + 1 ); if( p==0 ){ sqlite3_result_error_nomem(pCtx); return 0; diff --git a/ext/misc/memstat.c b/ext/misc/memstat.c index dcd5742..800a86e 100644 --- a/ext/misc/memstat.c +++ b/ext/misc/memstat.c @@ -143,7 +143,7 @@ static int memstatFindSchemas(memstat_cursor *pCur){ } while( sqlite3_step(pStmt)==SQLITE_ROW ){ char **az, *z; - az = sqlite3_realloc(pCur->azDb, sizeof(char*)*(pCur->nDb+1)); + az = sqlite3_realloc64(pCur->azDb, sizeof(char*)*(pCur->nDb+1)); if( az==0 ){ memstatClearSchema(pCur); return SQLITE_NOMEM; diff --git a/ext/misc/memtrace.c b/ext/misc/memtrace.c new file mode 100644 index 0000000..19ff4c4 --- /dev/null +++ b/ext/misc/memtrace.c @@ -0,0 +1,108 @@ +/* +** 2019-01-21 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file implements an extension that uses the SQLITE_CONFIG_MALLOC +** mechanism to add a tracing layer on top of SQLite. If this extension +** is registered prior to sqlite3_initialize(), it will cause all memory +** allocation activities to be logged on standard output, or to some other +** FILE specified by the initializer. +** +** This file needs to be compiled into the application that uses it. +** +** This extension is used to implement the --memtrace option of the +** command-line shell. +*/ +#include +#include +#include + +/* The original memory allocation routines */ +static sqlite3_mem_methods memtraceBase; +static FILE *memtraceOut; + +/* Methods that trace memory allocations */ +static void *memtraceMalloc(int n){ + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", + memtraceBase.xRoundup(n)); + } + return memtraceBase.xMalloc(n); +} +static void memtraceFree(void *p){ + if( p==0 ) return; + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p)); + } + memtraceBase.xFree(p); +} +static void *memtraceRealloc(void *p, int n){ + if( p==0 ) return memtraceMalloc(n); + if( n==0 ){ + memtraceFree(p); + return 0; + } + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n", + memtraceBase.xSize(p), memtraceBase.xRoundup(n)); + } + return memtraceBase.xRealloc(p, n); +} +static int memtraceSize(void *p){ + return memtraceBase.xSize(p); +} +static int memtraceRoundup(int n){ + return memtraceBase.xRoundup(n); +} +static int memtraceInit(void *p){ + return memtraceBase.xInit(p); +} +static void memtraceShutdown(void *p){ + memtraceBase.xShutdown(p); +} + +/* The substitute memory allocator */ +static sqlite3_mem_methods ersaztMethods = { + memtraceMalloc, + memtraceFree, + memtraceRealloc, + memtraceSize, + memtraceRoundup, + memtraceInit, + memtraceShutdown, + 0 +}; + +/* Begin tracing memory allocations to out. */ +int sqlite3MemTraceActivate(FILE *out){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc==0 ){ + rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods); + } + } + memtraceOut = out; + return rc; +} + +/* Deactivate memory tracing */ +int sqlite3MemTraceDeactivate(void){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc!=0 ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + memset(&memtraceBase, 0, sizeof(memtraceBase)); + } + } + memtraceOut = 0; + return rc; +} diff --git a/ext/misc/mmapwarm.c b/ext/misc/mmapwarm.c index 4e23638..970a873 100644 --- a/ext/misc/mmapwarm.c +++ b/ext/misc/mmapwarm.c @@ -105,4 +105,3 @@ int sqlite3_mmap_warm(sqlite3 *db, const char *zDb){ return rc; } - diff --git a/ext/misc/nextchar.c b/ext/misc/nextchar.c index 49dfd24..bf44e06 100644 --- a/ext/misc/nextchar.c +++ b/ext/misc/nextchar.c @@ -85,7 +85,7 @@ static void nextCharAppend(nextCharContext *p, unsigned c){ if( p->nUsed+1 > p->nAlloc ){ unsigned int *aNew; int n = p->nAlloc*2 + 30; - aNew = sqlite3_realloc(p->aResult, n*sizeof(unsigned int)); + aNew = sqlite3_realloc64(p->aResult, n*sizeof(unsigned int)); if( aNew==0 ){ p->mallocFailed = 1; return; @@ -269,7 +269,7 @@ static void nextCharFunc( sqlite3_result_error_nomem(context); }else{ unsigned char *pRes; - pRes = sqlite3_malloc( c.nUsed*4 + 1 ); + pRes = sqlite3_malloc64( c.nUsed*4 + 1 ); if( pRes==0 ){ sqlite3_result_error_nomem(context); }else{ diff --git a/ext/misc/percentile.c b/ext/misc/percentile.c index a5d7e84..a8e4981 100644 --- a/ext/misc/percentile.c +++ b/ext/misc/percentile.c @@ -151,7 +151,7 @@ static void percentStep(sqlite3_context *pCtx, int argc, sqlite3_value **argv){ /* Allocate and store the Y */ if( p->nUsed>=p->nAlloc ){ unsigned n = p->nAlloc*2 + 250; - double *a = sqlite3_realloc(p->a, sizeof(double)*n); + double *a = sqlite3_realloc64(p->a, sizeof(double)*n); if( a==0 ){ sqlite3_free(p->a); memset(p, 0, sizeof(*p)); diff --git a/ext/misc/prefixes.c b/ext/misc/prefixes.c new file mode 100644 index 0000000..3aa579b --- /dev/null +++ b/ext/misc/prefixes.c @@ -0,0 +1,319 @@ +/* +** 2018-04-19 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file implements a table-valued function: +** +** prefixes('abcdefg') +** +** The function has a single (non-HIDDEN) column named prefix that takes +** on all prefixes of the string in its argument, including an empty string +** and the input string itself. The order of prefixes is from longest +** to shortest. +*/ +#if !defined(SQLITE_CORE) || !defined(SQLITE_OMIT_VIRTUALTABLE) +#if !defined(SQLITEINT_H) +#include "sqlite3ext.h" +#endif +SQLITE_EXTENSION_INIT1 +#include +#include + +/* prefixes_vtab is a subclass of sqlite3_vtab which is +** underlying representation of the virtual table +*/ +typedef struct prefixes_vtab prefixes_vtab; +struct prefixes_vtab { + sqlite3_vtab base; /* Base class - must be first */ + /* No additional fields are necessary */ +}; + +/* prefixes_cursor is a subclass of sqlite3_vtab_cursor which will +** serve as the underlying representation of a cursor that scans +** over rows of the result +*/ +typedef struct prefixes_cursor prefixes_cursor; +struct prefixes_cursor { + sqlite3_vtab_cursor base; /* Base class - must be first */ + sqlite3_int64 iRowid; /* The rowid */ + char *zStr; /* Original string to be prefixed */ + int nStr; /* Length of the string in bytes */ +}; + +/* +** The prefixesConnect() method is invoked to create a new +** template virtual table. +** +** Think of this routine as the constructor for prefixes_vtab objects. +** +** All this routine needs to do is: +** +** (1) Allocate the prefixes_vtab object and initialize all fields. +** +** (2) Tell SQLite (via the sqlite3_declare_vtab() interface) what the +** result set of queries against the virtual table will look like. +*/ +static int prefixesConnect( + sqlite3 *db, + void *pAux, + int argc, const char *const*argv, + sqlite3_vtab **ppVtab, + char **pzErr +){ + prefixes_vtab *pNew; + int rc; + + rc = sqlite3_declare_vtab(db, + "CREATE TABLE prefixes(prefix TEXT, original_string TEXT HIDDEN)" + ); + if( rc==SQLITE_OK ){ + pNew = sqlite3_malloc( sizeof(*pNew) ); + *ppVtab = (sqlite3_vtab*)pNew; + if( pNew==0 ) return SQLITE_NOMEM; + memset(pNew, 0, sizeof(*pNew)); + } + return rc; +} + +/* +** This method is the destructor for prefixes_vtab objects. +*/ +static int prefixesDisconnect(sqlite3_vtab *pVtab){ + prefixes_vtab *p = (prefixes_vtab*)pVtab; + sqlite3_free(p); + return SQLITE_OK; +} + +/* +** Constructor for a new prefixes_cursor object. +*/ +static int prefixesOpen(sqlite3_vtab *p, sqlite3_vtab_cursor **ppCursor){ + prefixes_cursor *pCur; + pCur = sqlite3_malloc( sizeof(*pCur) ); + if( pCur==0 ) return SQLITE_NOMEM; + memset(pCur, 0, sizeof(*pCur)); + *ppCursor = &pCur->base; + return SQLITE_OK; +} + +/* +** Destructor for a prefixes_cursor. +*/ +static int prefixesClose(sqlite3_vtab_cursor *cur){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + sqlite3_free(pCur->zStr); + sqlite3_free(pCur); + return SQLITE_OK; +} + + +/* +** Advance a prefixes_cursor to its next row of output. +*/ +static int prefixesNext(sqlite3_vtab_cursor *cur){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + pCur->iRowid++; + return SQLITE_OK; +} + +/* +** Return values of columns for the row at which the prefixes_cursor +** is currently pointing. +*/ +static int prefixesColumn( + sqlite3_vtab_cursor *cur, /* The cursor */ + sqlite3_context *ctx, /* First argument to sqlite3_result_...() */ + int i /* Which column to return */ +){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + switch( i ){ + case 0: + sqlite3_result_text(ctx, pCur->zStr, pCur->nStr - (int)pCur->iRowid, + 0); + break; + default: + sqlite3_result_text(ctx, pCur->zStr, pCur->nStr, 0); + break; + } + return SQLITE_OK; +} + +/* +** Return the rowid for the current row. In this implementation, the +** rowid is the same as the output value. +*/ +static int prefixesRowid(sqlite3_vtab_cursor *cur, sqlite_int64 *pRowid){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + *pRowid = pCur->iRowid; + return SQLITE_OK; +} + +/* +** Return TRUE if the cursor has been moved off of the last +** row of output. +*/ +static int prefixesEof(sqlite3_vtab_cursor *cur){ + prefixes_cursor *pCur = (prefixes_cursor*)cur; + return pCur->iRowid>pCur->nStr; +} + +/* +** This method is called to "rewind" the prefixes_cursor object back +** to the first row of output. This method is always called at least +** once prior to any call to prefixesColumn() or prefixesRowid() or +** prefixesEof(). +*/ +static int prefixesFilter( + sqlite3_vtab_cursor *pVtabCursor, + int idxNum, const char *idxStr, + int argc, sqlite3_value **argv +){ + prefixes_cursor *pCur = (prefixes_cursor *)pVtabCursor; + sqlite3_free(pCur->zStr); + if( argc>0 ){ + pCur->zStr = sqlite3_mprintf("%s", sqlite3_value_text(argv[0])); + pCur->nStr = pCur->zStr ? (int)strlen(pCur->zStr) : 0; + }else{ + pCur->zStr = 0; + pCur->nStr = 0; + } + pCur->iRowid = 0; + return SQLITE_OK; +} + +/* +** SQLite will invoke this method one or more times while planning a query +** that uses the virtual table. This routine needs to create +** a query plan for each invocation and compute an estimated cost for that +** plan. +*/ +static int prefixesBestIndex( + sqlite3_vtab *tab, + sqlite3_index_info *pIdxInfo +){ + /* Search for a usable equality constraint against column 1 + ** (original_string) and use it if at all possible */ + int i; + const struct sqlite3_index_constraint *p; + + for(i=0, p=pIdxInfo->aConstraint; inConstraint; i++, p++){ + if( p->iColumn!=1 ) continue; + if( p->op!=SQLITE_INDEX_CONSTRAINT_EQ ) continue; + if( !p->usable ) continue; + pIdxInfo->aConstraintUsage[i].argvIndex = 1; + pIdxInfo->aConstraintUsage[i].omit = 1; + pIdxInfo->estimatedCost = (double)10; + pIdxInfo->estimatedRows = 10; + return SQLITE_OK; + } + pIdxInfo->estimatedCost = (double)1000000000; + pIdxInfo->estimatedRows = 1000000000; + return SQLITE_OK; +} + +/* +** This following structure defines all the methods for the +** virtual table. +*/ +static sqlite3_module prefixesModule = { + /* iVersion */ 0, + /* xCreate */ 0, + /* xConnect */ prefixesConnect, + /* xBestIndex */ prefixesBestIndex, + /* xDisconnect */ prefixesDisconnect, + /* xDestroy */ 0, + /* xOpen */ prefixesOpen, + /* xClose */ prefixesClose, + /* xFilter */ prefixesFilter, + /* xNext */ prefixesNext, + /* xEof */ prefixesEof, + /* xColumn */ prefixesColumn, + /* xRowid */ prefixesRowid, + /* xUpdate */ 0, + /* xBegin */ 0, + /* xSync */ 0, + /* xCommit */ 0, + /* xRollback */ 0, + /* xFindMethod */ 0, + /* xRename */ 0, + /* xSavepoint */ 0, + /* xRelease */ 0, + /* xRollbackTo */ 0, + /* xShadowName */ 0 +}; + +/* +** This is a copy of the SQLITE_SKIP_UTF8(zIn) macro in sqliteInt.h. +** +** Assuming zIn points to the first byte of a UTF-8 character, +** advance zIn to point to the first byte of the next UTF-8 character. +*/ +#define PREFIX_SKIP_UTF8(zIn) { \ + if( (*(zIn++))>=0xc0 ){ \ + while( (*zIn & 0xc0)==0x80 ){ zIn++; } \ + } \ +} + +/* +** Implementation of function prefix_length(). This function accepts two +** strings as arguments and returns the length in characters (not bytes), +** of the longest prefix shared by the two strings. For example: +** +** prefix_length('abcdxxx', 'abcyy') == 3 +** prefix_length('abcdxxx', 'bcyyy') == 0 +** prefix_length('abcdxxx', 'ab') == 2 +** prefix_length('ab', 'abcd') == 2 +** +** This function assumes the input is well-formed utf-8. If it is not, +** it is possible for this function to return -1. +*/ +static void prefixLengthFunc( + sqlite3_context *ctx, + int nVal, + sqlite3_value **apVal +){ + int nByte; /* Number of bytes to compare */ + int nRet = 0; /* Return value */ + const unsigned char *zL = sqlite3_value_text(apVal[0]); + const unsigned char *zR = sqlite3_value_text(apVal[1]); + int nL = sqlite3_value_bytes(apVal[0]); + int nR = sqlite3_value_bytes(apVal[1]); + int i; + + nByte = (nL > nR ? nL : nR); + for(i=0; inState ); + pToFree = sqlite3_malloc64( sizeof(ReStateNumber)*2*pRe->nState ); if( pToFree==0 ) return -1; aStateSet[0].aState = pToFree; } @@ -337,10 +337,10 @@ re_match_end: static int re_resize(ReCompiled *p, int N){ char *aOp; int *aArg; - aOp = sqlite3_realloc(p->aOp, N*sizeof(p->aOp[0])); + aOp = sqlite3_realloc64(p->aOp, N*sizeof(p->aOp[0])); if( aOp==0 ) return 1; p->aOp = aOp; - aArg = sqlite3_realloc(p->aArg, N*sizeof(p->aArg[0])); + aArg = sqlite3_realloc64(p->aArg, N*sizeof(p->aArg[0])); if( aArg==0 ) return 1; p->aArg = aArg; p->nAlloc = N; diff --git a/ext/misc/unionvtab.c b/ext/misc/unionvtab.c index 2d2053c..7366023 100644 --- a/ext/misc/unionvtab.c +++ b/ext/misc/unionvtab.c @@ -250,11 +250,11 @@ struct UnionCsr { ** is attempted but fails, NULL is returned and *pRc is set to ** SQLITE_NOMEM. */ -static void *unionMalloc(int *pRc, int nByte){ +static void *unionMalloc(int *pRc, sqlite3_int64 nByte){ void *pRet; assert( nByte>0 ); if( *pRc==SQLITE_OK ){ - pRet = sqlite3_malloc(nByte); + pRet = sqlite3_malloc64(nByte); if( pRet ){ memset(pRet, 0, nByte); }else{ @@ -276,7 +276,7 @@ static void *unionMalloc(int *pRc, int nByte){ static char *unionStrdup(int *pRc, const char *zIn){ char *zRet = 0; if( zIn ){ - int nByte = (int)strlen(zIn) + 1; + sqlite3_int64 nByte = strlen(zIn) + 1; zRet = unionMalloc(pRc, nByte); if( zRet ){ memcpy(zRet, zIn, nByte); @@ -939,7 +939,7 @@ static int unionConnect( /* Grow the pTab->aSrc[] array if required. */ if( nAlloc<=pTab->nSrc ){ int nNew = nAlloc ? nAlloc*2 : 8; - UnionSrc *aNew = (UnionSrc*)sqlite3_realloc( + UnionSrc *aNew = (UnionSrc*)sqlite3_realloc64( pTab->aSrc, nNew*sizeof(UnionSrc) ); if( aNew==0 ){ diff --git a/ext/misc/vfslog.c b/ext/misc/vfslog.c index b55b06f..24a46a9 100644 --- a/ext/misc/vfslog.c +++ b/ext/misc/vfslog.c @@ -276,7 +276,7 @@ static VLogLog *vlogLogOpen(const char *zFilename){ && sqlite3_strglob("-mj??????9??", zFilename+nName-12)==0 ){ return 0; /* Do not log master journal files */ } - pTemp = sqlite3_malloc( sizeof(*pLog)*2 + nName + 60 ); + pTemp = sqlite3_malloc64( sizeof(*pLog)*2 + nName + 60 ); if( pTemp==0 ) return 0; pMutex = sqlite3_mutex_alloc(SQLITE_MUTEX_STATIC_MASTER); sqlite3_mutex_enter(pMutex); diff --git a/ext/misc/zipfile.c b/ext/misc/zipfile.c index e57dc38..0b14917 100644 --- a/ext/misc/zipfile.c +++ b/ext/misc/zipfile.c @@ -358,7 +358,7 @@ static int zipfileConnect( rc = sqlite3_declare_vtab(db, ZIPFILE_SCHEMA); if( rc==SQLITE_OK ){ - pNew = (ZipfileTab*)sqlite3_malloc(nByte+nFile); + pNew = (ZipfileTab*)sqlite3_malloc64((sqlite3_int64)nByte+nFile); if( pNew==0 ) return SQLITE_NOMEM; memset(pNew, 0, nByte+nFile); pNew->db = db; @@ -806,7 +806,7 @@ static int zipfileGetEntry( } if( rc==SQLITE_OK ){ - int nAlloc; + sqlite3_int64 nAlloc; ZipfileEntry *pNew; int nFile = zipfileGetU16(&aRead[ZIPFILE_CDS_NFILE_OFF]); @@ -818,7 +818,7 @@ static int zipfileGetEntry( nAlloc += zipfileGetU32(&aRead[ZIPFILE_CDS_SZCOMPRESSED_OFF]); } - pNew = (ZipfileEntry*)sqlite3_malloc(nAlloc); + pNew = (ZipfileEntry*)sqlite3_malloc64(nAlloc); if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ @@ -981,11 +981,11 @@ static int zipfileDeflate( u8 **ppOut, int *pnOut, /* Output */ char **pzErr /* OUT: Error message */ ){ - int nAlloc = (int)compressBound(nIn); + sqlite3_int64 nAlloc = compressBound(nIn); u8 *aOut; int rc = SQLITE_OK; - aOut = (u8*)sqlite3_malloc(nAlloc); + aOut = (u8*)sqlite3_malloc64(nAlloc); if( aOut==0 ){ rc = SQLITE_NOMEM; }else{ @@ -1058,7 +1058,7 @@ static int zipfileColumn( if( pCsr->pCurrent->aData ){ aBuf = pCsr->pCurrent->aData; }else{ - aBuf = aFree = sqlite3_malloc(sz); + aBuf = aFree = sqlite3_malloc64(sz); if( aBuf==0 ){ rc = SQLITE_NOMEM; }else{ @@ -1897,14 +1897,14 @@ struct ZipfileCtx { static int zipfileBufferGrow(ZipfileBuffer *pBuf, int nByte){ if( pBuf->n+nByte>pBuf->nAlloc ){ u8 *aNew; - int nNew = pBuf->n ? pBuf->n*2 : 512; + sqlite3_int64 nNew = pBuf->n ? pBuf->n*2 : 512; int nReq = pBuf->n + nByte; while( nNewa, nNew); + aNew = sqlite3_realloc64(pBuf->a, nNew); if( aNew==0 ) return SQLITE_NOMEM; pBuf->a = aNew; - pBuf->nAlloc = nNew; + pBuf->nAlloc = (int)nNew; } return SQLITE_OK; } @@ -2095,7 +2095,7 @@ void zipfileStep(sqlite3_context *pCtx, int nVal, sqlite3_value **apVal){ void zipfileFinal(sqlite3_context *pCtx){ ZipfileCtx *p; ZipfileEOCD eocd; - int nZip; + sqlite3_int64 nZip; u8 *aZip; p = (ZipfileCtx*)sqlite3_aggregate_context(pCtx, sizeof(ZipfileCtx)); @@ -2108,14 +2108,14 @@ void zipfileFinal(sqlite3_context *pCtx){ eocd.iOffset = p->body.n; nZip = p->body.n + p->cds.n + ZIPFILE_EOCD_FIXED_SZ; - aZip = (u8*)sqlite3_malloc(nZip); + aZip = (u8*)sqlite3_malloc64(nZip); if( aZip==0 ){ sqlite3_result_error_nomem(pCtx); }else{ memcpy(aZip, p->body.a, p->body.n); memcpy(&aZip[p->body.n], p->cds.a, p->cds.n); zipfileSerializeEOCD(&eocd, &aZip[p->body.n + p->cds.n]); - sqlite3_result_blob(pCtx, aZip, nZip, zipfileFree); + sqlite3_result_blob(pCtx, aZip, (int)nZip, zipfileFree); } } diff --git a/ext/rbu/rbu_common.tcl b/ext/rbu/rbu_common.tcl index 2b263b7..b5e63aa 100644 --- a/ext/rbu/rbu_common.tcl +++ b/ext/rbu/rbu_common.tcl @@ -86,12 +86,13 @@ proc step_rbu_legacy {target rbu} { set rc } -proc do_rbu_vacuum_test {tn step} { - forcedelete state.db - uplevel [list do_test $tn.1 { - if {$step==0} { sqlite3rbu_vacuum rbu test.db state.db } +proc do_rbu_vacuum_test {tn step {statedb state.db}} { + forcedelete $statedb + if {$statedb=="" && $step==1} breakpoint + uplevel [list do_test $tn.1 [string map [list %state% $statedb] { + if {$step==0} { sqlite3rbu_vacuum rbu test.db {%state%}} while 1 { - if {$step==1} { sqlite3rbu_vacuum rbu test.db state.db } + if {$step==1} { sqlite3rbu_vacuum rbu test.db {%state%}} set state [rbu state] check_prestep_state test.db $state set rc [rbu step] @@ -100,7 +101,7 @@ proc do_rbu_vacuum_test {tn step} { if {$step==1} { rbu close } } rbu close - } {SQLITE_DONE}] + }] {SQLITE_DONE}] uplevel [list do_execsql_test $tn.2 { PRAGMA integrity_check diff --git a/ext/rbu/rbuvacuum2.test b/ext/rbu/rbuvacuum2.test index 4713580..6d6dfde 100644 --- a/ext/rbu/rbuvacuum2.test +++ b/ext/rbu/rbuvacuum2.test @@ -16,8 +16,11 @@ source [file join [file dirname [info script]] rbu_common.tcl] -foreach step {0 1} { - set ::testprefix rbuvacuum2-$step +foreach {step} {0 1} { +foreach {ttt state} { + s state.db t test.db-vacuum n {} +} { + set ::testprefix rbuvacuum2-$step$ttt #------------------------------------------------------------------------- # Test that a database that contains fts3 tables can be vacuumed. @@ -29,7 +32,7 @@ foreach step {0 1} { INSERT INTO t1 VALUES('fix this issue', 'at some point'); } - do_rbu_vacuum_test 1.2 $step + do_rbu_vacuum_test 1.2 $step $state do_execsql_test 1.3 { SELECT * FROM t1; @@ -46,7 +49,7 @@ foreach step {0 1} { INSERT INTO t1 VALUES('a b c', 'x y z'); } - do_rbu_vacuum_test 1.6 $step + do_rbu_vacuum_test 1.6 $step $state do_execsql_test 1.7 { INSERT INTO t1(t1) VALUES('integrity-check'); SELECT * FROM t1; @@ -67,7 +70,7 @@ foreach step {0 1} { INSERT INTO t1 VALUES('fix this issue', 'at some point'); } - do_rbu_vacuum_test 2.2 $step + do_rbu_vacuum_test 2.2 $step $state do_execsql_test 2.3 { SELECT * FROM t1; @@ -84,7 +87,7 @@ foreach step {0 1} { INSERT INTO t1 VALUES('a b c', 'x y z'); } - do_rbu_vacuum_test 2.6 $step + do_rbu_vacuum_test 2.6 $step $state do_execsql_test 2.7 { INSERT INTO t1(t1) VALUES('integrity-check'); SELECT * FROM t1; @@ -107,7 +110,7 @@ foreach step {0 1} { INSERT INTO rt VALUES(3, 55, 65); } - do_rbu_vacuum_test 3.2 $step + do_rbu_vacuum_test 3.2 $step $state do_execsql_test 3.3 { SELECT * FROM rt; @@ -120,7 +123,7 @@ foreach step {0 1} { SELECT rowid FROM rt WHERE x2>59 AND x1 < 59 } {2 3} - do_rbu_vacuum_test 3.5 $step + do_rbu_vacuum_test 3.5 $step $state do_execsql_test 3.6.1 { SELECT rowid FROM rt WHERE x2>51 AND x1 < 51 @@ -147,7 +150,7 @@ foreach step {0 1} { trigger tr1 t1 0 {CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN SELECT 1; END} } - do_rbu_vacuum_test 4.3 $step + do_rbu_vacuum_test 4.3 $step $state do_execsql_test 4.4 { SELECT * FROM sqlite_master; } { @@ -157,6 +160,7 @@ foreach step {0 1} { } } } +} #------------------------------------------------------------------------- # Test that passing a NULL value as the second argument to @@ -231,4 +235,9 @@ do_test 6.3 { execsql { PRAGMA integrity_check } } {ok} +do_test 6.4 { + sqlite3rbu_vacuum rbu test.db test.db-vactmp + list [catch { rbu close } msg] $msg +} {1 SQLITE_MISUSE} + finish_test diff --git a/ext/rbu/rbuvacuum3.test b/ext/rbu/rbuvacuum3.test new file mode 100644 index 0000000..7e1e337 --- /dev/null +++ b/ext/rbu/rbuvacuum3.test @@ -0,0 +1,63 @@ +# 2019 Jan 3 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# This file contains tests for the RBU module. More specifically, it +# contains tests to ensure that the sqlite3rbu_vacuum() API works as +# expected. +# + +source [file join [file dirname [info script]] rbu_common.tcl] +set testprefix rbuvacuum3 + +do_execsql_test 1.0 { + CREATE TABLE t1(a PRIMARY KEY, b, c); + CREATE INDEX i1b ON t1(b); + CREATE INDEX i1c ON t1(c); + + WITH s(i) AS ( + VALUES(1) UNION ALL SELECT i+1 FROM s WHERE i<100 + ) + INSERT INTO t1 SELECT i, randomblob(100), randomblob(100) FROM s; +} + +forcedelete state.db +do_test 1.1 { + sqlite3rbu_vacuum rbu test.db state.db + while {1} { + set rc [rbu step] + if {$rc!="SQLITE_OK"} break + rbu savestate + } + rbu close +} {SQLITE_DONE} + +do_test 1.2 { + sqlite3rbu_vacuum rbu test.db state.db + while {1} { + set rc [rbu step] + if {$rc!="SQLITE_OK"} break + rbu savestate + } + rbu close +} {SQLITE_DONE} + +do_test 1.3 { + while {1} { + sqlite3rbu_vacuum rbu test.db state.db + set rc [rbu step] + if {$rc!="SQLITE_OK"} break + rbu savestate + rbu close + } + rbu close +} {SQLITE_DONE} + +finish_test diff --git a/ext/rbu/sqlite3rbu.c b/ext/rbu/sqlite3rbu.c index cd2f96c..e86606b 100644 --- a/ext/rbu/sqlite3rbu.c +++ b/ext/rbu/sqlite3rbu.c @@ -2477,7 +2477,7 @@ static void rbuOpenDatabase(sqlite3rbu *p, int *pbRetry){ if( *zExtra=='\0' ) zExtra = 0; } - zTarget = sqlite3_mprintf("file:%s-vacuum?rbu_memory=1%s%s", + zTarget = sqlite3_mprintf("file:%s-vactmp?rbu_memory=1%s%s", sqlite3_db_filename(p->dbRbu, "main"), (zExtra==0 ? "" : "&"), (zExtra==0 ? "" : zExtra) ); @@ -3743,6 +3743,12 @@ sqlite3rbu *sqlite3rbu_vacuum( const char *zState ){ if( zTarget==0 ){ return rbuMisuseError(); } + if( zState ){ + int n = strlen(zState); + if( n>=7 && 0==memcmp("-vactmp", &zState[n-7], 7) ){ + return rbuMisuseError(); + } + } /* TODO: Check that both arguments are non-NULL */ return openRbuHandle(0, zTarget, zState); } @@ -3939,7 +3945,10 @@ int sqlite3rbu_savestate(sqlite3rbu *p){ if( p->eStage==RBU_STAGE_OAL ){ assert( rc!=SQLITE_DONE ); if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "COMMIT", 0, 0, 0); - if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbRbu, "BEGIN IMMEDIATE", 0, 0, 0); + if( rc==SQLITE_OK ){ + const char *zBegin = rbuIsVacuum(p) ? "BEGIN" : "BEGIN IMMEDIATE"; + rc = sqlite3_exec(p->dbRbu, zBegin, 0, 0, 0); + } if( rc==SQLITE_OK ) rc = sqlite3_exec(p->dbMain, "BEGIN IMMEDIATE", 0, 0,0); } diff --git a/ext/rbu/sqlite3rbu.h b/ext/rbu/sqlite3rbu.h index 1acbcca..69d8950 100644 --- a/ext/rbu/sqlite3rbu.h +++ b/ext/rbu/sqlite3rbu.h @@ -333,7 +333,11 @@ SQLITE_API sqlite3rbu *sqlite3rbu_open( ** name of the state database is "-vacuum", where ** is the name of the target database file. In this case, on UNIX, if the ** state database is not already present in the file-system, it is created -** with the same permissions as the target db is made. +** with the same permissions as the target db is made. +** +** With an RBU vacuum, it is an SQLITE_MISUSE error if the name of the +** state database ends with "-vactmp". This name is reserved for internal +** use. ** ** This function does not delete the state database after an RBU vacuum ** is completed, even if it created it. However, if the call to diff --git a/ext/rbu/test_rbu.c b/ext/rbu/test_rbu.c index e0b4d77..6d04bfe 100644 --- a/ext/rbu/test_rbu.c +++ b/ext/rbu/test_rbu.c @@ -273,6 +273,7 @@ static int SQLITE_TCLAPI test_sqlite3rbu_vacuum( zCmd = Tcl_GetString(objv[1]); zTarget = Tcl_GetString(objv[2]); if( objc==4 ) zStateDb = Tcl_GetString(objv[3]); + if( zStateDb && zStateDb[0]=='\0' ) zStateDb = 0; pRbu = sqlite3rbu_vacuum(zTarget, zStateDb); Tcl_CreateObjCommand(interp, zCmd, test_sqlite3rbu_cmd, (ClientData)pRbu, 0); diff --git a/ext/rtree/geopoly.c b/ext/rtree/geopoly.c index f6a31f5..d93eca2 100644 --- a/ext/rtree/geopoly.c +++ b/ext/rtree/geopoly.c @@ -124,6 +124,14 @@ struct GeoPoly { */ #define GEOPOLY_SZ(N) (sizeof(GeoPoly) + sizeof(GeoCoord)*2*((N)-4)) +/* Macros to access coordinates of a GeoPoly. +** We have to use these macros, rather than just say p->a[i] in order +** to silence (incorrect) UBSAN warnings if the array index is too large. +*/ +#define GeoX(P,I) (((GeoCoord*)(P)->a)[(I)*2]) +#define GeoY(P,I) (((GeoCoord*)(P)->a)[(I)*2+1]) + + /* ** State of a parse of a GeoJSON input. */ @@ -316,8 +324,9 @@ static GeoPoly *geopolyFuncParam( memcpy(p->hdr, a, nByte); if( a[0] != *(unsigned char*)&x ){ int ii; - for(ii=0; iia[ii]); + for(ii=0; iihdr[0] ^= 1; } @@ -376,9 +385,9 @@ static void geopolyJsonFunc( int i; sqlite3_str_append(x, "[", 1); for(i=0; inVertex; i++){ - sqlite3_str_appendf(x, "[%!g,%!g],", p->a[i*2], p->a[i*2+1]); + sqlite3_str_appendf(x, "[%!g,%!g],", GeoX(p,i), GeoY(p,i)); } - sqlite3_str_appendf(x, "[%!g,%!g]]", p->a[0], p->a[1]); + sqlite3_str_appendf(x, "[%!g,%!g]]", GeoX(p,0), GeoY(p,0)); sqlite3_result_text(context, sqlite3_str_finish(x), -1, sqlite3_free); sqlite3_free(p); } @@ -395,7 +404,9 @@ static void geopolySvgFunc( int argc, sqlite3_value **argv ){ - GeoPoly *p = geopolyFuncParam(context, argv[0], 0); + GeoPoly *p; + if( argc<1 ) return; + p = geopolyFuncParam(context, argv[0], 0); if( p ){ sqlite3 *db = sqlite3_context_db_handle(context); sqlite3_str *x = sqlite3_str_new(db); @@ -403,10 +414,10 @@ static void geopolySvgFunc( char cSep = '\''; sqlite3_str_appendf(x, "a[i*2], p->a[i*2+1]); + sqlite3_str_appendf(x, "%c%g,%g", cSep, GeoX(p,i), GeoY(p,i)); cSep = ' '; } - sqlite3_str_appendf(x, " %g,%g'", p->a[0], p->a[1]); + sqlite3_str_appendf(x, " %g,%g'", GeoX(p,0), GeoY(p,0)); for(i=1; inVertex; ii++){ - x0 = p->a[ii*2]; - y0 = p->a[ii*2+1]; + x0 = GeoX(p,ii); + y0 = GeoY(p,ii); x1 = (GeoCoord)(A*x0 + B*y0 + E); y1 = (GeoCoord)(C*x0 + D*y0 + F); - p->a[ii*2] = x1; - p->a[ii*2+1] = y1; + GeoX(p,ii) = x1; + GeoY(p,ii) = y1; } sqlite3_result_blob(context, p->hdr, 4+8*p->nVertex, SQLITE_TRANSIENT); @@ -475,12 +486,12 @@ static double geopolyArea(GeoPoly *p){ double rArea = 0.0; int ii; for(ii=0; iinVertex-1; ii++){ - rArea += (p->a[ii*2] - p->a[ii*2+2]) /* (x0 - x1) */ - * (p->a[ii*2+1] + p->a[ii*2+3]) /* (y0 + y1) */ + rArea += (GeoX(p,ii) - GeoX(p,ii+1)) /* (x0 - x1) */ + * (GeoY(p,ii) + GeoY(p,ii+1)) /* (y0 + y1) */ * 0.5; } - rArea += (p->a[ii*2] - p->a[0]) /* (xN - x0) */ - * (p->a[ii*2+1] + p->a[1]) /* (yN + y0) */ + rArea += (GeoX(p,ii) - GeoX(p,0)) /* (xN - x0) */ + * (GeoY(p,ii) + GeoY(p,0)) /* (yN + y0) */ * 0.5; return rArea; } @@ -527,13 +538,13 @@ static void geopolyCcwFunc( if( p ){ if( geopolyArea(p)<0.0 ){ int ii, jj; - for(ii=2, jj=p->nVertex*2 - 2; iia[ii]; - p->a[ii] = p->a[jj]; - p->a[jj] = t; - t = p->a[ii+1]; - p->a[ii+1] = p->a[jj+1]; - p->a[jj+1] = t; + for(ii=1, jj=p->nVertex-1; iihdr, @@ -593,8 +604,8 @@ static void geopolyRegularFunc( p->hdr[3] = n&0xff; for(i=0; ia[i*2] = x - r*geopolySine(rAngle-0.5*GEOPOLY_PI); - p->a[i*2+1] = y + r*geopolySine(rAngle); + GeoX(p,i) = x - r*geopolySine(rAngle-0.5*GEOPOLY_PI); + GeoY(p,i) = y + r*geopolySine(rAngle); } sqlite3_result_blob(context, p->hdr, 4+8*n, SQLITE_TRANSIENT); sqlite3_free(p); @@ -631,13 +642,13 @@ static GeoPoly *geopolyBBox( } if( p ){ int ii; - mnX = mxX = p->a[0]; - mnY = mxY = p->a[1]; + mnX = mxX = GeoX(p,0); + mnY = mxY = GeoY(p,0); for(ii=1; iinVertex; ii++){ - double r = p->a[ii*2]; + double r = GeoX(p,ii); if( rmxX ) mxX = (float)r; - r = p->a[ii*2+1]; + r = GeoY(p,ii); if( rmxY ) mxY = (float)r; } @@ -657,14 +668,14 @@ static GeoPoly *geopolyBBox( pOut->hdr[1] = 0; pOut->hdr[2] = 0; pOut->hdr[3] = 4; - pOut->a[0] = mnX; - pOut->a[1] = mnY; - pOut->a[2] = mxX; - pOut->a[3] = mnY; - pOut->a[4] = mxX; - pOut->a[5] = mxY; - pOut->a[6] = mnX; - pOut->a[7] = mxY; + GeoX(pOut,0) = mnX; + GeoY(pOut,0) = mnY; + GeoX(pOut,1) = mxX; + GeoY(pOut,1) = mnY; + GeoX(pOut,2) = mxX; + GeoY(pOut,2) = mxY; + GeoX(pOut,3) = mnX; + GeoY(pOut,3) = mxY; }else{ sqlite3_free(p); aCoord[0].f = mnX; @@ -802,14 +813,14 @@ static void geopolyContainsPointFunc( int ii; if( p1==0 ) return; for(ii=0; iinVertex-1; ii++){ - v = pointBeneathLine(x0,y0,p1->a[ii*2],p1->a[ii*2+1], - p1->a[ii*2+2],p1->a[ii*2+3]); + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,ii+1),GeoY(p1,ii+1)); if( v==2 ) break; cnt += v; } if( v!=2 ){ - v = pointBeneathLine(x0,y0,p1->a[ii*2],p1->a[ii*2+1], - p1->a[0],p1->a[1]); + v = pointBeneathLine(x0,y0,GeoX(p1,ii), GeoY(p1,ii), + GeoX(p1,0), GeoY(p1,0)); } if( v==2 ){ sqlite3_result_int(context, 1); @@ -931,10 +942,10 @@ static void geopolyAddSegments( unsigned int i; GeoCoord *x; for(i=0; i<(unsigned)pPoly->nVertex-1; i++){ - x = pPoly->a + (i*2); + x = &GeoX(pPoly,i); geopolyAddOneSegment(p, x[0], x[1], x[2], x[3], side, i); } - x = pPoly->a + (i*2); + x = &GeoX(pPoly,i); geopolyAddOneSegment(p, x[0], x[1], pPoly->a[0], pPoly->a[1], side, i); } diff --git a/ext/rtree/rtree.c b/ext/rtree/rtree.c index 4b044cb..73d0661 100644 --- a/ext/rtree/rtree.c +++ b/ext/rtree/rtree.c @@ -128,6 +128,9 @@ struct Rtree { u8 inWrTrans; /* True if inside write transaction */ u8 nAux; /* # of auxiliary columns in %_rowid */ u8 nAuxNotNull; /* Number of initial not-null aux columns */ +#ifdef SQLITE_DEBUG + u8 bCorrupt; /* Shadow table corruption detected */ +#endif int iDepth; /* Current depth of the r-tree structure */ char *zDb; /* Name of database containing r-tree table */ char *zName; /* Name of r-tree table */ @@ -187,6 +190,15 @@ struct Rtree { # define RTREE_ZERO 0.0 #endif +/* +** Set the Rtree.bCorrupt flag +*/ +#ifdef SQLITE_DEBUG +# define RTREE_IS_CORRUPT(X) ((X)->bCorrupt = 1) +#else +# define RTREE_IS_CORRUPT(X) +#endif + /* ** When doing a search of an r-tree, instances of the following structure ** record intermediate results from the tree walk. @@ -553,8 +565,8 @@ static void nodeZero(Rtree *pRtree, RtreeNode *p){ ** Given a node number iNode, return the corresponding key to use ** in the Rtree.aHash table. */ -static int nodeHash(i64 iNode){ - return iNode % HASHSIZE; +static unsigned int nodeHash(i64 iNode){ + return ((unsigned)iNode) % HASHSIZE; } /* @@ -599,7 +611,7 @@ static void nodeHashDelete(Rtree *pRtree, RtreeNode *pNode){ */ static RtreeNode *nodeNew(Rtree *pRtree, RtreeNode *pParent){ RtreeNode *pNode; - pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode) + pRtree->iNodeSize); + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode) + pRtree->iNodeSize); if( pNode ){ memset(pNode, 0, sizeof(RtreeNode) + pRtree->iNodeSize); pNode->zData = (u8 *)&pNode[1]; @@ -623,6 +635,18 @@ static void nodeBlobReset(Rtree *pRtree){ } } +/* +** Check to see if pNode is the same as pParent or any of the parents +** of pParent. +*/ +static int nodeInParentChain(const RtreeNode *pNode, const RtreeNode *pParent){ + do{ + if( pNode==pParent ) return 1; + pParent = pParent->pParent; + }while( pParent ); + return 0; +} + /* ** Obtain a reference to an r-tree node. */ @@ -641,6 +665,10 @@ static int nodeAcquire( if( (pNode = nodeHashLookup(pRtree, iNode))!=0 ){ assert( !pParent || !pNode->pParent || pNode->pParent==pParent ); if( pParent && !pNode->pParent ){ + if( nodeInParentChain(pNode, pParent) ){ + RTREE_IS_CORRUPT(pRtree); + return SQLITE_CORRUPT_VTAB; + } pParent->nRef++; pNode->pParent = pParent; } @@ -671,9 +699,12 @@ static int nodeAcquire( *ppNode = 0; /* If unable to open an sqlite3_blob on the desired row, that can only ** be because the shadow tables hold erroneous data. */ - if( rc==SQLITE_ERROR ) rc = SQLITE_CORRUPT_VTAB; + if( rc==SQLITE_ERROR ){ + rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); + } }else if( pRtree->iNodeSize==sqlite3_blob_bytes(pRtree->pNodeBlob) ){ - pNode = (RtreeNode *)sqlite3_malloc(sizeof(RtreeNode)+pRtree->iNodeSize); + pNode = (RtreeNode *)sqlite3_malloc64(sizeof(RtreeNode)+pRtree->iNodeSize); if( !pNode ){ rc = SQLITE_NOMEM; }else{ @@ -686,7 +717,6 @@ static int nodeAcquire( pNode->pNext = 0; rc = sqlite3_blob_read(pRtree->pNodeBlob, pNode->zData, pRtree->iNodeSize, 0); - nodeReference(pParent); } } @@ -700,6 +730,7 @@ static int nodeAcquire( pRtree->iDepth = readInt16(pNode->zData); if( pRtree->iDepth>RTREE_MAX_DEPTH ){ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); } } @@ -710,14 +741,17 @@ static int nodeAcquire( if( pNode && rc==SQLITE_OK ){ if( NCELL(pNode)>((pRtree->iNodeSize-4)/pRtree->nBytesPerCell) ){ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); } } if( rc==SQLITE_OK ){ if( pNode!=0 ){ + nodeReference(pParent); nodeHashInsert(pRtree, pNode); }else{ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); } *ppNode = pNode; }else{ @@ -943,7 +977,7 @@ static void rtreeRelease(Rtree *pRtree){ pRtree->inWrTrans = 0; assert( pRtree->nCursor==0 ); nodeBlobReset(pRtree); - assert( pRtree->nNodeRef==0 ); + assert( pRtree->nNodeRef==0 || pRtree->bCorrupt ); sqlite3_finalize(pRtree->pWriteNode); sqlite3_finalize(pRtree->pDeleteNode); sqlite3_finalize(pRtree->pReadRowid); @@ -1002,7 +1036,7 @@ static int rtreeOpen(sqlite3_vtab *pVTab, sqlite3_vtab_cursor **ppCursor){ Rtree *pRtree = (Rtree *)pVTab; RtreeCursor *pCsr; - pCsr = (RtreeCursor *)sqlite3_malloc(sizeof(RtreeCursor)); + pCsr = (RtreeCursor *)sqlite3_malloc64(sizeof(RtreeCursor)); if( pCsr ){ memset(pCsr, 0, sizeof(RtreeCursor)); pCsr->base.pVtab = pVTab; @@ -1275,6 +1309,7 @@ static int nodeRowidIndex( return SQLITE_OK; } } + RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } @@ -1368,7 +1403,7 @@ static RtreeSearchPoint *rtreeEnqueue( RtreeSearchPoint *pNew; if( pCur->nPoint>=pCur->nPointAlloc ){ int nNew = pCur->nPointAlloc*2 + 8; - pNew = sqlite3_realloc(pCur->aPoint, nNew*sizeof(pCur->aPoint[0])); + pNew = sqlite3_realloc64(pCur->aPoint, nNew*sizeof(pCur->aPoint[0])); if( pNew==0 ) return 0; pCur->aPoint = pNew; pCur->nPointAlloc = nNew; @@ -1770,7 +1805,7 @@ static int rtreeFilter( */ rc = nodeAcquire(pRtree, 1, 0, &pRoot); if( rc==SQLITE_OK && argc>0 ){ - pCsr->aConstraint = sqlite3_malloc(sizeof(RtreeConstraint)*argc); + pCsr->aConstraint = sqlite3_malloc64(sizeof(RtreeConstraint)*argc); pCsr->nConstraint = argc; if( !pCsr->aConstraint ){ rc = SQLITE_NOMEM; @@ -1915,20 +1950,20 @@ static int rtreeBestIndex(sqlite3_vtab *tab, sqlite3_index_info *pIdxInfo){ ){ u8 op; switch( p->op ){ - case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break; - case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break; - case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break; - case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break; - case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break; - default: - assert( p->op==SQLITE_INDEX_CONSTRAINT_MATCH ); - op = RTREE_MATCH; - break; + case SQLITE_INDEX_CONSTRAINT_EQ: op = RTREE_EQ; break; + case SQLITE_INDEX_CONSTRAINT_GT: op = RTREE_GT; break; + case SQLITE_INDEX_CONSTRAINT_LE: op = RTREE_LE; break; + case SQLITE_INDEX_CONSTRAINT_LT: op = RTREE_LT; break; + case SQLITE_INDEX_CONSTRAINT_GE: op = RTREE_GE; break; + case SQLITE_INDEX_CONSTRAINT_MATCH: op = RTREE_MATCH; break; + default: op = 0; break; + } + if( op ){ + zIdxStr[iIdx++] = op; + zIdxStr[iIdx++] = (char)(p->iColumn - 1 + '0'); + pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2); + pIdxInfo->aConstraintUsage[ii].omit = 1; } - zIdxStr[iIdx++] = op; - zIdxStr[iIdx++] = (char)(p->iColumn - 1 + '0'); - pIdxInfo->aConstraintUsage[ii].argvIndex = (iIdx/2); - pIdxInfo->aConstraintUsage[ii].omit = 1; } } @@ -1964,11 +1999,11 @@ static RtreeDValue cellArea(Rtree *pRtree, RtreeCell *p){ #endif { switch( pRtree->nDim ){ - case 5: area = p->aCoord[9].i - p->aCoord[8].i; - case 4: area *= p->aCoord[7].i - p->aCoord[6].i; - case 3: area *= p->aCoord[5].i - p->aCoord[4].i; - case 2: area *= p->aCoord[3].i - p->aCoord[2].i; - default: area *= p->aCoord[1].i - p->aCoord[0].i; + case 5: area = (i64)p->aCoord[9].i - (i64)p->aCoord[8].i; + case 4: area *= (i64)p->aCoord[7].i - (i64)p->aCoord[6].i; + case 3: area *= (i64)p->aCoord[5].i - (i64)p->aCoord[4].i; + case 2: area *= (i64)p->aCoord[3].i - (i64)p->aCoord[2].i; + default: area *= (i64)p->aCoord[1].i - (i64)p->aCoord[0].i; } } return area; @@ -2137,12 +2172,14 @@ static int AdjustTree( RtreeCell *pCell /* This cell was just inserted */ ){ RtreeNode *p = pNode; + int cnt = 0; while( p->pParent ){ RtreeNode *pParent = p->pParent; RtreeCell cell; int iCell; - if( nodeParentIndex(pRtree, p, &iCell) ){ + if( (++cnt)>1000 || nodeParentIndex(pRtree, p, &iCell) ){ + RTREE_IS_CORRUPT(pRtree); return SQLITE_CORRUPT_VTAB; } @@ -2339,9 +2376,9 @@ static int splitNodeStartree( int iBestSplit = 0; RtreeDValue fBestMargin = RTREE_ZERO; - int nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int)); + sqlite3_int64 nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int)); - aaSorted = (int **)sqlite3_malloc(nByte); + aaSorted = (int **)sqlite3_malloc64(nByte); if( !aaSorted ){ return SQLITE_NOMEM; } @@ -2462,7 +2499,7 @@ static int SplitNode( /* Allocate an array and populate it with a copy of pCell and ** all cells from node pLeft. Then zero the original node. */ - aCell = sqlite3_malloc((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); + aCell = sqlite3_malloc64((sizeof(RtreeCell)+sizeof(int))*(nCell+1)); if( !aCell ){ rc = SQLITE_NOMEM; goto splitnode_out; @@ -2610,7 +2647,10 @@ static int fixLeafParent(Rtree *pRtree, RtreeNode *pLeaf){ } rc = sqlite3_reset(pRtree->pReadParent); if( rc==SQLITE_OK ) rc = rc2; - if( rc==SQLITE_OK && !pChild->pParent ) rc = SQLITE_CORRUPT_VTAB; + if( rc==SQLITE_OK && !pChild->pParent ){ + RTREE_IS_CORRUPT(pRtree); + rc = SQLITE_CORRUPT_VTAB; + } pChild = pChild->pParent; } return rc; @@ -2750,7 +2790,7 @@ static int Reinsert( /* Allocate the buffers used by this operation. The allocation is ** relinquished before this function returns. */ - aCell = (RtreeCell *)sqlite3_malloc(n * ( + aCell = (RtreeCell *)sqlite3_malloc64(n * ( sizeof(RtreeCell) + /* aCell array */ sizeof(int) + /* aOrder array */ sizeof(int) + /* aSpare array */ @@ -2924,8 +2964,12 @@ static int rtreeDeleteRowid(Rtree *pRtree, sqlite3_int64 iDelete){ rc = findLeafNode(pRtree, iDelete, &pLeaf, 0); } +#ifdef CORRUPT_DB + assert( pLeaf!=0 || rc!=SQLITE_OK || CORRUPT_DB ); +#endif + /* Delete the cell in question from the leaf node. */ - if( rc==SQLITE_OK ){ + if( rc==SQLITE_OK && pLeaf ){ int rc2; rc = nodeRowidIndex(pRtree, pLeaf, iDelete, &iCell); if( rc==SQLITE_OK ){ @@ -3197,7 +3241,7 @@ static int rtreeUpdate( rc = rc2; } } - if( pRtree->nAux ){ + if( rc==SQLITE_OK && pRtree->nAux ){ sqlite3_stmt *pUp = pRtree->pWriteAux; int jj; sqlite3_bind_int64(pUp, 1, *pRowid); @@ -3395,6 +3439,7 @@ static int rtreeSqlInit( }; sqlite3_stmt **appStmt[N_STATEMENT]; int i; + const int f = SQLITE_PREPARE_PERSISTENT|SQLITE_PREPARE_NO_VTAB; pRtree->db = db; @@ -3451,8 +3496,7 @@ static int rtreeSqlInit( } zSql = sqlite3_mprintf(zFormat, zDb, zPrefix); if( zSql ){ - rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT, - appStmt[i], 0); + rc = sqlite3_prepare_v3(db, zSql, -1, f, appStmt[i], 0); }else{ rc = SQLITE_NOMEM; } @@ -3482,8 +3526,7 @@ static int rtreeSqlInit( if( zSql==0 ){ rc = SQLITE_NOMEM; }else{ - rc = sqlite3_prepare_v3(db, zSql, -1, SQLITE_PREPARE_PERSISTENT, - &pRtree->pWriteAux, 0); + rc = sqlite3_prepare_v3(db, zSql, -1, f, &pRtree->pWriteAux, 0); sqlite3_free(zSql); } } @@ -3559,6 +3602,7 @@ static int getNodeSize( *pzErr = sqlite3_mprintf("%s", sqlite3_errmsg(db)); }else if( pRtree->iNodeSize<(512-64) ){ rc = SQLITE_CORRUPT_VTAB; + RTREE_IS_CORRUPT(pRtree); *pzErr = sqlite3_mprintf("undersize RTree blobs in \"%q_node\"", pRtree->zName); } @@ -3614,7 +3658,7 @@ static int rtreeInit( /* Allocate the sqlite3_vtab structure */ nDb = (int)strlen(argv[1]); nName = (int)strlen(argv[2]); - pRtree = (Rtree *)sqlite3_malloc(sizeof(Rtree)+nDb+nName+2); + pRtree = (Rtree *)sqlite3_malloc64(sizeof(Rtree)+nDb+nName+2); if( !pRtree ){ return SQLITE_NOMEM; } @@ -3882,8 +3926,7 @@ static void rtreeCheckAppendMsg(RtreeCheck *pCheck, const char *zFmt, ...){ static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){ u8 *pRet = 0; /* Return value */ - assert( pCheck->rc==SQLITE_OK ); - if( pCheck->pGetNode==0 ){ + if( pCheck->rc==SQLITE_OK && pCheck->pGetNode==0 ){ pCheck->pGetNode = rtreeCheckPrepare(pCheck, "SELECT data FROM %Q.'%q_node' WHERE nodeno=?", pCheck->zDb, pCheck->zTab @@ -3895,7 +3938,7 @@ static u8 *rtreeCheckGetNode(RtreeCheck *pCheck, i64 iNode, int *pnNode){ if( sqlite3_step(pCheck->pGetNode)==SQLITE_ROW ){ int nNode = sqlite3_column_bytes(pCheck->pGetNode, 0); const u8 *pNode = (const u8*)sqlite3_column_blob(pCheck->pGetNode, 0); - pRet = sqlite3_malloc(nNode); + pRet = sqlite3_malloc64(nNode); if( pRet==0 ){ pCheck->rc = SQLITE_NOMEM; }else{ @@ -4328,12 +4371,12 @@ static void rtreeMatchArgFree(void *pArg){ static void geomCallback(sqlite3_context *ctx, int nArg, sqlite3_value **aArg){ RtreeGeomCallback *pGeomCtx = (RtreeGeomCallback *)sqlite3_user_data(ctx); RtreeMatchArg *pBlob; - int nBlob; + sqlite3_int64 nBlob; int memErr = 0; nBlob = sizeof(RtreeMatchArg) + (nArg-1)*sizeof(RtreeDValue) + nArg*sizeof(sqlite3_value*); - pBlob = (RtreeMatchArg *)sqlite3_malloc(nBlob); + pBlob = (RtreeMatchArg *)sqlite3_malloc64(nBlob); if( !pBlob ){ sqlite3_result_error_nomem(ctx); }else{ diff --git a/ext/rtree/rtree1.test b/ext/rtree/rtree1.test index bdaad54..7749457 100644 --- a/ext/rtree/rtree1.test +++ b/ext/rtree/rtree1.test @@ -647,5 +647,19 @@ do_execsql_test 16.130 { SELECT * FROM rt1 WHERE id IN (1, 2, 3, 4); } {1 1.0 2.0 aux1 2 2.0 3.0 aux2 3 3.0 4.0 aux3 4 4.0 5.0 aux4} +reset_db +do_execsql_test 17.0 { + CREATE VIRTUAL TABLE t1 USING rtree(id, x1 PRIMARY KEY, x2, y1, y2); + CREATE VIRTUAL TABLE t2 USING rtree(id, x1, x2, y1, y2 UNIQUE); +} +do_execsql_test 17.1 { + REINDEX t1; + REINDEX t2; +} {} + +do_execsql_test 17.2 { + REINDEX; +} {} + expand_all_sql db finish_test diff --git a/ext/rtree/rtree6.test b/ext/rtree/rtree6.test index 6800b4b..bc9ff84 100644 --- a/ext/rtree/rtree6.test +++ b/ext/rtree/rtree6.test @@ -15,6 +15,7 @@ if {![info exists testdir]} { set testdir [file join [file dirname [info script]] .. .. test] } source $testdir/tester.tcl +set testprefix rtree6 ifcapable {!rtree || rtree_int_only} { finish_test @@ -58,6 +59,9 @@ do_test rtree6-1.1 { do_test rtree6-1.2 { rtree_strategy {SELECT * FROM t1 WHERE x1>10} } {E0} +do_test rtree6-1.2.1 { + rtree_strategy {SELECT * FROM t1 WHERE x1>10 AND x2 LIKE '%x%'} +} {E0} do_test rtree6-1.3 { rtree_strategy {SELECT * FROM t1 WHERE x1<10} @@ -164,5 +168,14 @@ do_execsql_test rtree6-3.5 { x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>0.5 AND x1>1.1 } {} +#------------------------------------------------------------------------- +reset_db +do_execsql_test 4.0 { + CREATE VIRTUAL TABLE t1 USING rtree(id,x0,x1,y0,y1); +} +do_execsql_test 4.1 { + DELETE FROM t1 WHERE x0>1 AND x1<2 OR y0<92; +} + expand_all_sql db finish_test diff --git a/ext/rtree/rtreecirc.test b/ext/rtree/rtreecirc.test new file mode 100644 index 0000000..d77ed04 --- /dev/null +++ b/ext/rtree/rtreecirc.test @@ -0,0 +1,66 @@ +# 2018 Dec 22 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# This file implements regression tests for SQLite library. The +# focus of this script is testing the FTS5 module. +# + +if {![info exists testdir]} { + set testdir [file join [file dirname [info script]] .. .. test] +} +source [file join [file dirname [info script]] rtree_util.tcl] +source $testdir/tester.tcl +set testprefix rtreecirc + +ifcapable !rtree { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE rt USING rtree(id, x1, x2, y1, y2); + SELECT name FROM sqlite_master ORDER BY 1; +} { + rt rt_node rt_parent rt_rowid +} +db_save_and_close + +foreach {tn schema sql} { + 1 { + CREATE TRIGGER tr1 AFTER INSERT ON rt_node BEGIN + SELECT * FROM rt; + END; + } { + INSERT INTO rt VALUES(1, 2, 3, 4, 5); + } + 2 { + CREATE TRIGGER tr1 AFTER INSERT ON rt_parent BEGIN + SELECT * FROM rt; + END; + } { + INSERT INTO rt VALUES(1, 2, 3, 4, 5); + } + 3 { + CREATE TRIGGER tr1 AFTER INSERT ON rt_rowid BEGIN + SELECT * FROM rt; + END; + } { + INSERT INTO rt VALUES(1, 2, 3, 4, 5); + } +} { + db_restore_and_reopen + do_execsql_test 1.1.$tn.1 $schema + do_catchsql_test 1.1.$tn.2 $sql {1 {no such table: main.rt}} + db close +} + + +finish_test + diff --git a/ext/rtree/rtreefuzz001.test b/ext/rtree/rtreefuzz001.test new file mode 100644 index 0000000..201308c --- /dev/null +++ b/ext/rtree/rtreefuzz001.test @@ -0,0 +1,777 @@ +# 2012-12-21 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Test cases for corrupt database files. + +if {![info exists testdir]} { + set testdir [file join [file dirname [info script]] .. .. test] +} +source $testdir/tester.tcl + +ifcapable !deserialize||!rtree { + finish_test + return +} +database_may_be_corrupt + +do_test rtreefuzz001-100 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename c1b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 03 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 03 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 ................ +| 96: 00 2e 30 38 0d 00 00 00 04 0e 9c 00 0f ad 0f 4f ..08...........O +| 112: 0e fc 0e 9c 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3728: 00 00 00 00 00 00 00 00 00 00 00 00 5e 04 07 17 ............^... +| 3744: 1f 1f 01 81 0b 74 61 62 6c 65 74 31 5f 70 61 72 .....tablet1_par +| 3760: 65 6e 74 74 31 5f 70 61 72 65 6e 74 04 43 52 45 entt1_parent.CRE +| 3776: 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 70 61 ATE TABLE .t1_pa +| 3792: 72 66 6e 74 22 28 6e 6f 64 65 6e 6f 20 49 4e 54 rfnt.(nodeno INT +| 3808: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3824: 2c 70 61 72 65 6e 74 6e 6f 64 65 29 51 03 06 17 ,parentnode)Q... +| 3840: 1b 1b 01 7b 74 61 62 6c 65 74 31 5f 6e 6f 64 65 ....tablet1_node +| 3856: 74 31 5f 6e 6f 64 65 03 43 52 45 41 54 45 20 54 t1_node.CREATE T +| 3872: 41 42 4c 45 20 22 74 31 5f 6e 6f 64 65 22 28 6e ABLE .t1_node.(n +| 3888: 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 odeno INTEGER PR +| 3904: 49 4d 41 52 59 20 4b 45 59 2c 64 61 74 61 29 5c IMARY KEY,data). +| 3920: 02 07 17 1d 1d 01 81 0b 74 61 62 6c 65 74 31 5f ........tablet1_ +| 3936: 72 6f 77 69 64 74 31 5f 72 6f 77 69 64 02 43 52 rowidt1_rowid.CR +| 3952: 45 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 72 EATE TABLE .t1_r +| 3968: 6f 77 69 64 22 28 72 6f 77 69 64 20 49 4e 54 45 owid.(rowid INTE +| 3984: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY, +| 4000: 6e 6f 64 65 6e 6f 2c 61 30 2c 61 31 29 51 01 07 nodeno,a0,a1)Q.. +| 4016: 17 11 11 08 81 0f 74 61 62 6c 65 74 31 74 31 43 ......tablet1t1C +| 4032: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 4048: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 72 74 72 BLE t1 USING rtr +| 4064: 65 65 28 69 64 2c 78 30 2c 78 31 2c 79 30 2c 79 ee(id,x0,x1,y0,y +| 4080: 31 2c 2b 6c 61 62 65 6c 2c 2b 6f 74 68 65 72 29 1,+label,+other) +| page 2 offset 4096 +| 0: 0d 0c cd 00 74 08 75 01 0f e8 0c b3 0f d0 0f b7 ....t.u......... +| 16: 0f 9e 0f 91 0f 81 0f 70 0f 5e 0f 4f 0f 39 0f 29 .......p.^.O.9.) +| 32: 0f 18 0f 06 0e f7 0c 65 0e 58 0d c2 0d 2c 0c 25 .......e.X...,.% +| 48: 0b 85 0a e5 0a 45 09 a5 09 05 0c 83 0c 93 0c a3 .....E.......... +| 64: 0f f0 0c 15 0b 75 0a d5 0a 35 09 95 08 f5 0e d8 .....u...5...... +| 80: 0e 42 0d ac 0d 16 0c 05 0b 65 0a c5 0a 25 09 85 .B.......e...%.. +| 96: 08 e5 0e c8 0e 32 0d 9c 0d 06 0b f5 0b 55 0a b5 .....2.......U.. +| 112: 0a 15 09 75 08 d5 0e b8 0e 22 0d 8c 0c f6 0b e5 ...u............ +| 128: 0b 45 0a a5 0a 05 09 65 08 c5 0e a8 0e 12 0d 7c .E.....e.......| +| 144: 0c e6 0b d5 0b 35 0a 95 09 f5 09 55 08 b5 0e 98 .....5.....U.... +| 160: 0e 02 0d 6c 0c d6 0b c5 0b 25 0a 85 09 e5 09 45 ...l.....%.....E +| 176: 08 a5 0e 88 0d f2 0d 5c 0c 55 0b b5 0b 15 0a 75 .........U.....u +| 192: 09 d5 09 35 08 95 0e 78 0d e2 0d 4c 0c 45 0b a5 ...5...x...L.E.. +| 208: 0b 05 0a 65 09 c5 09 25 08 85 0e 68 0d d2 0d 3c ...e...%...h...< +| 224: 0c 35 0b 95 0a f5 0a 55 09 b5 09 15 08 75 0c 75 .5.....U.....u.u +| 2160: 00 00 00 00 00 0d 8e 75 05 00 01 1b 00 04 62 6f .......u......bo +| 2176: 78 2d 39 2c 39 0d 8e 11 05 00 01 1b 00 02 62 6f x-9,9.........bo +| 2192: 78 2d 39 2c 38 0d 8d 2d 05 00 01 1b 00 02 62 6f x-9,8..-......bo +| 2208: 78 2d 39 2c 37 0d 8c 49 05 00 01 1b 00 02 62 6f x-9,7..I......bo +| 2224: 78 2d 39 2c 36 0d 8b 65 05 00 01 1b 00 02 62 6f x-9,6..e......bo +| 2240: 78 2d 39 2c 35 0d 8b 01 05 00 01 1b 00 02 62 6f x-9,5.........bo +| 2256: 78 2d 39 2c 34 0d 8a 1d 05 00 01 1b 00 02 62 6f x-9,4.........bo +| 2272: 78 2d 39 2c 33 0d 89 39 05 00 01 1b 00 02 62 6f x-9,3..9......bo +| 2288: 78 2d 39 2c 32 0d 88 55 05 00 01 1b 00 02 62 6f x-9,2..U......bo +| 2304: 78 2d 39 2c 31 0d 87 71 05 00 01 1b 00 02 62 6f x-9,1..q......bo +| 2320: 78 2d 39 2c 30 0d 8e 74 05 00 01 1b 00 04 62 6f x-9,0..t......bo +| 2336: 78 2d 38 2c 39 0d 8e 10 05 00 01 1b 00 02 62 6f x-8,9.........bo +| 2352: 78 2d 38 2c 38 0d 8d 2c 05 00 01 1b 00 02 62 6f x-8,8..,......bo +| 2368: 78 2d 38 2c 37 0d 8c 48 05 00 01 1b 00 02 62 6f x-8,7..H......bo +| 2384: 78 2d 38 2c 36 0d 8b 64 05 00 01 1b 00 02 62 6f x-8,6..d......bo +| 2400: 78 2d 38 2c 35 0d 8b 00 05 00 01 1b 00 02 62 6f x-8,5.........bo +| 2416: 78 2d 38 2c 34 0d 8a 1c 05 00 01 1b 00 02 62 6f x-8,4.........bo +| 2432: 78 2d 38 2c 33 0d 89 38 05 00 01 1b 00 02 62 6f x-8,3..8......bo +| 2448: 78 2d 38 2c 32 0d 88 54 05 00 01 1b 00 02 62 6f x-8,2..T......bo +| 2464: 78 2d 38 2c 31 0d 87 70 05 00 01 1b 00 02 62 6f x-8,1..p......bo +| 2480: 78 2d 38 2c 30 0d 8e 73 05 00 01 1b 00 05 62 6f x-8,0..s......bo +| 2496: 78 2d 37 2c 39 0d 8e 0f 05 00 01 1b 00 05 62 6f x-7,9.........bo +| 2512: 78 2d 37 2c 38 0d 8d 2b 05 00 01 1b 00 05 62 6f x-7,8..+......bo +| 2528: 78 2d 37 2c 37 0d 8c 47 05 00 01 1b 00 05 62 6f x-7,7..G......bo +| 2544: 78 2d 37 2c 36 0d 8b 63 05 00 01 1b 00 05 62 6f x-7,6..c......bo +| 2560: 78 2d 37 2c 35 0d 8a 7f 05 00 01 1b 00 05 62 6f x-7,5.........bo +| 2576: 78 2d 37 2c 34 0d 8a 1b 05 00 01 1b 00 05 62 6f x-7,4.........bo +| 2592: 78 2d 37 2c 33 0d 89 37 05 00 01 1b 00 05 62 6f x-7,3..7......bo +| 2608: 78 2d 37 2c 32 0d 88 53 05 00 01 1b 00 05 62 6f x-7,2..S......bo +| 2624: 78 2d 37 2c 31 0d 87 6f 05 00 01 1b 00 05 62 6f x-7,1..o......bo +| 2640: 78 2d 37 2c 30 0d 8e 72 05 00 01 1b 00 04 62 6f x-7,0..r......bo +| 2656: 78 2d 36 2c 39 0d 8e 0e 05 00 01 1b 00 05 62 6f x-6,9.........bo +| 2672: 78 2d 36 2c 38 0d 8d 2a 05 00 01 1b 00 05 62 6f x-6,8..*......bo +| 2688: 78 2d 36 2c 37 0d 8c 46 05 00 01 1b 00 05 62 6f x-6,7..F......bo +| 2704: 78 2d 36 2c 36 0d 8b 62 05 00 01 1b 00 05 62 6f x-6,6..b......bo +| 2720: 78 2d 36 2c 35 0d 8a 7e 05 00 01 1b 00 05 62 6f x-6,5..~......bo +| 2736: 78 2d 36 2c 34 0d 8a 1a 05 00 01 1b 00 05 62 6f x-6,4.........bo +| 2752: 78 2d 36 2c 33 0d 89 36 05 00 01 1b 00 05 62 6f x-6,3..6......bo +| 2768: 78 2d 36 2c 32 0d 88 52 05 00 01 1b 00 05 62 6f x-6,2..R......bo +| 2784: 78 2d 36 2c 31 0d 87 6e 05 00 01 1b 00 05 62 6f x-6,1..n......bo +| 2800: 78 2d 36 2c 30 0d 8e 71 05 00 01 1b 00 04 62 6f x-6,0..q......bo +| 2816: 78 2d 35 2c 39 0d 8e 0d 05 00 01 1b 00 05 62 6f x-5,9.........bo +| 2832: 78 2d 35 2c 38 0d 8d 29 05 00 01 1b 00 05 62 6f x-5,8..)......bo +| 2848: 78 2d 35 2c 37 0d 8c 45 05 00 01 1b 00 05 62 6f x-5,7..E......bo +| 2864: 78 2d 35 2c 36 0d 8b 61 05 00 01 1b 00 05 62 6f x-5,6..a......bo +| 2880: 78 2d 35 2c 35 0d 8a 7d 05 00 01 1b 00 05 62 6f x-5,5.........bo +| 2896: 78 2d 35 2c 34 0d 8a 19 05 00 01 1b 00 05 62 6f x-5,4.........bo +| 2912: 78 2d 35 2c 33 0d 89 35 05 00 01 1b 00 05 62 6f x-5,3..5......bo +| 2928: 78 2d 35 2c 32 0d 88 51 05 00 01 1b 00 05 62 6f x-5,2..Q......bo +| 2944: 78 2d 35 2c 31 0d 87 6d 05 00 01 1b 00 05 62 6f x-5,1..m......bo +| 2960: 78 2d 35 2c 30 0d 8e 70 05 00 01 1b 00 04 62 6f x-5,0..p......bo +| 2976: 78 2d 34 2c 39 0d 8e 0c 05 00 01 1b 00 04 62 6f x-4,9.........bo +| 2992: 78 2d 34 2c 38 0d 8d 28 05 00 01 1b 00 04 62 6f x-4,8..(......bo +| 3008: 78 2d 34 2c 37 0d 8c 44 05 00 01 1b 00 04 62 6f x-4,7..D......bo +| 3024: 78 2d 34 2c 36 0d 8b 60 05 00 01 1b 00 02 62 6f x-4,6..`......bo +| 3040: 78 2d 34 2c 35 0d 8a 7c 05 00 01 1b 00 02 62 6f x-4,5..|......bo +| 3056: 78 2d 34 2c 34 0d 8a 18 05 00 01 1b 00 02 62 6f x-4,4.........bo +| 3072: 78 2d 34 2c 33 0d 89 34 05 00 01 1b 00 02 62 6f x-4,3..4......bo +| 3088: 78 2d 34 2c 32 0d 88 50 05 00 01 1b 00 02 62 6f x-4,2..P......bo +| 3104: 78 2d 34 2c 31 0d 87 6c 05 00 01 1b 00 02 62 6f x-4,1..l......bo +| 3120: 78 2d 34 2c 30 0d 8e 6f 05 00 01 1b 00 04 62 6f x-4,0..o......bo +| 3136: 78 2d 33 2c 39 0d 8e 0b 05 00 01 1b 00 04 62 6f x-3,9.........bo +| 3152: 78 2d 33 2c 38 0d 8d 27 05 00 01 1b 00 04 62 6f x-3,8..'......bo +| 3168: 78 2d 33 2c 37 0d 87 68 05 00 01 1b 00 03 62 6f x-3,7..h......bo +| 3184: 78 2d 30 2c 30 06 90 d9 80 80 81 84 4c 05 00 01 x-0,0.......L... +| 3200: 00 00 03 0d 88 4c 05 00 01 1b 00 02 62 6f 78 2d .....L......box- +| 3216: 30 2c 31 0d 88 4d 05 00 01 1b 00 02 62 6f 78 2d 0,1..M......box- +| 3232: 31 2c 31 0d 88 4e 05 00 01 1b 00 02 62 6f 78 2d 1,1..N......box- +| 3248: 32 2c 31 17 01 05 00 01 2f 00 02 6c 6f 77 65 72 2,1...../..lower +| 3264: 2d 6c 65 66 74 20 63 6f 72 6e 65 72 0d 0d 26 00 -left corner..&. +| 3280: 09 00 01 00 00 04 0d 8c 43 05 00 01 1b 00 04 62 ........C......b +| 3296: 6f 78 2d 33 2c 36 0d 8b 5f 05 00 01 1b 00 02 62 ox-3,6.._......b +| 3312: 6f 78 2d 33 2c 35 0d 8a 7b 05 00 01 1b 00 02 62 ox-3,5.........b +| 3328: 6f 78 2d 33 2c 34 0d 8a 17 05 00 01 1b 00 02 62 ox-3,4.........b +| 3344: 6f 78 2d 33 2c 33 0d 89 33 05 00 01 1b 00 02 62 ox-3,3..3......b +| 3360: 6f 78 2d 33 2c 32 0d bc 00 06 00 09 0d 87 6b 05 ox-3,2........k. +| 3376: 00 01 1b 00 03 62 6f 78 2d 33 2c 30 0d 8e 6e 05 .....box-3,0..n. +| 3392: 00 01 1b 00 04 62 6f 78 2d 32 2c 39 0d 8e 0a 05 .....box-2,9.... +| 3408: 00 01 1b 00 04 62 6f 78 2d 32 2c 38 0d 8d 26 05 .....box-2,8..&. +| 3424: 00 01 1b 00 04 62 6f 78 2d 32 2c 37 0d 8c 42 05 .....box-2,7..B. +| 3440: 00 01 1b 00 04 62 6f 78 2d 32 2c 36 0d 8b 5e 05 .....box-2,6..^. +| 3456: 00 01 1b 00 02 62 6f 78 2d 32 2c 35 0d 8a 7a 05 .....box-2,5..z. +| 3472: 00 01 1b 00 02 62 6f 78 2d 32 2c 34 0d 8a 16 05 .....box-2,4.... +| 3488: 00 01 1b 00 02 62 6f 78 2d 32 2c 33 0d 89 32 05 .....box-2,3..2. +| 3504: 00 01 1b 00 02 62 6f 78 2d 32 2c 32 0e 52 00 06 .....box-2,2.R.. +| 3520: 00 09 0d 87 6a 05 00 01 1b 00 03 62 6f 78 2d 32 ....j......box-2 +| 3536: 2c 30 0d 8e 6d 05 00 01 1b 00 04 62 6f 78 2d 31 ,0..m......box-1 +| 3552: 2c 39 0d 8e 09 05 00 01 1b 00 04 62 6f 78 2d 31 ,9.........box-1 +| 3568: 2c 38 0d 8d 25 05 00 01 1b 00 04 62 6f 78 2d 31 ,8..%......box-1 +| 3584: 2c 37 0d 8c 41 05 00 01 1b 00 04 62 6f 78 2d 31 ,7..A......box-1 +| 3600: 2c 36 0d 8b 5d 05 00 01 1b 00 02 62 6f 78 2d 31 ,6..]......box-1 +| 3616: 2c 35 0d 8a 79 05 00 01 1b 00 02 62 6f 78 2d 31 ,5..y......box-1 +| 3632: 2c 34 0d 8a 15 05 00 01 1b 00 02 62 6f 78 2d 31 ,4.........box-1 +| 3648: 2c 33 0d 89 31 05 00 01 1b 00 02 62 6f 78 2d 31 ,3..1......box-1 +| 3664: 2c 32 0e e8 00 06 00 09 0d 87 69 05 00 01 1b 00 ,2........i..... +| 3680: 03 62 6f 78 2d 31 2c 30 0d 8e 6c 05 00 01 1b 00 .box-1,0..l..... +| 3696: 04 62 6f 78 2d 30 2c 39 0d 8e 08 05 00 01 1b 00 .box-0,9........ +| 3712: 04 62 6f 78 2d 30 2c 38 0d 8d 24 05 00 01 1b 00 .box-0,8..$..... +| 3728: 04 62 6f 78 2d 30 2c 37 0d 8c 40 05 00 01 1b 00 .box-0,7..@..... +| 3744: 04 62 6f 78 2d 30 2c 36 0d 8b 5c 05 00 01 1b 00 .box-0,6........ +| 3760: 02 62 6f 78 2d 30 2c 35 0d 8a 78 05 00 01 1b 00 .box-0,5..x..... +| 3776: 02 62 6f 78 2d 30 2c 34 0d 8a 14 05 00 01 1b 00 .box-0,4........ +| 3792: 02 62 6f 78 2d 30 2c 33 0d 89 30 05 00 01 1b 00 .box-0,3..0..... +| 3808: 02 62 6f 78 2d 30 2c 32 00 00 00 0f 00 09 1b 00 .box-0,2........ +| 3824: 62 6f 78 2d 30 2c 30 0d 0e 05 00 09 1d 00 74 6f box-0,0.......to +| 3840: 70 20 68 61 6c 66 10 0d 05 00 09 23 00 62 6f 74 p half.....#.bot +| 3856: 74 6f 6d 20 68 61 6c 66 0f 0c 02 05 09 01 00 72 tom half.......r +| 3872: 69 67 68 74 20 68 61 6c 66 0e 0b 05 00 09 1f 00 ight half....... +| 3888: 6c 65 66 74 20 68 61 6c 66 14 0a 05 00 09 2b 00 left half.....+. +| 3904: 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 0d the whole thing. +| 3920: 09 05 00 09 1d 00 74 6f 70 20 65 64 67 65 10 08 ......top edge.. +| 3936: 05 00 09 23 00 62 6f 74 74 6f 6d 20 65 64 67 65 ...#.bottom edge +| 3952: 0f 07 05 00 09 21 00 72 69 67 68 74 20 65 64 67 .....!.right edg +| 3968: 65 0e 06 05 00 09 1f 00 6c 65 66 74 20 65 64 67 e.......left edg +| 3984: 65 0b 05 05 00 09 19 00 63 65 6e 74 65 72 17 04 e.......center.. +| 4000: 05 00 09 31 00 75 70 70 65 72 2d 72 69 67 68 74 ...1.upper-right +| 4016: 20 63 6f 72 6e 65 72 17 03 05 00 09 31 00 6c 6f corner.....1.lo +| 4032: 77 65 72 2d 72 69 67 68 74 20 63 6f 72 6e 65 72 wer-right corner +| 4048: 16 02 05 00 09 2f 00 75 70 70 65 72 2d 6c 65 66 ...../.upper-lef +| 4064: 74 20 63 6f 72 6e 65 72 06 00 05 00 01 00 00 03 t corner........ +| 4080: 0d 88 4f 05 00 01 1b 00 02 62 6f 78 2d 33 2c 31 ..O......box-3,1 +| page 3 offset 8192 +| 0: 05 00 00 00 01 0f fb 00 00 00 00 06 0f fb 00 00 ................ +| 384: 00 00 00 00 00 00 00 89 50 03 04 00 93 24 00 00 ........P....$.. +| 400: 00 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 688: 00 00 00 00 42 c8 00 00 42 4c 00 00 42 00 00 00 ....B...BL..B... +| 720: 03 eb 40 40 00 00 40 80 00 00 00 00 00 00 3f 80 ..@@..@.......?. +| 736: 00 00 00 00 00 00 00 00 03 ea 40 00 00 00 40 40 ..........@...@@ +| 752: 00 00 00 00 00 00 3f 80 00 00 00 00 00 00 00 00 ......?......... +| 768: 03 e9 3f 80 00 00 40 00 00 00 00 00 00 00 3f 80 ..?...@.......?. +| 784: 00 00 00 00 00 00 00 00 03 e8 00 00 00 00 3f 80 ..............?. +| 800: 00 00 00 00 00 00 3f 80 00 00 00 00 00 00 00 00 ......?......... +| 1616: 00 00 00 00 00 00 00 00 00 00 89 50 02 04 00 93 ...........P.... +| 1632: 24 00 00 00 33 00 00 00 00 00 00 00 01 00 00 00 $...3........... +| 1648: 00 41 20 00 00 00 00 00 00 41 0e 00 00 00 00 00 .A ......A...... +| 1664: 00 00 00 04 4f 40 40 00 00 40 80 00 00 3f 80 00 ....O@@..@...?.. +| 1680: 00 40 00 00 00 00 00 00 00 00 00 04 4e 40 00 00 .@..........N@.. +| 1696: 00 40 40 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@@..?...@...... +| 1712: 00 00 00 04 4d 3f 80 00 00 40 00 00 00 3f 80 00 ....M?...@...?.. +| 1728: 00 40 00 00 00 00 00 00 00 00 00 04 4c 00 00 00 .@..........L... +| 1744: 00 3f 80 00 00 3f 80 00 00 40 00 00 00 00 00 00 .?...?...@...... +| 1760: 00 00 00 04 b3 40 40 00 00 40 80 00 00 40 00 00 .....@@..@...@.. +| 1776: 00 40 40 00 00 00 00 00 00 00 00 04 b2 40 00 00 .@@..........@.. +| 1792: 00 40 40 00 00 40 00 00 00 40 40 00 00 00 00 00 .@@..@...@@..... +| 1808: 00 00 00 04 b1 3f 80 00 00 40 00 00 00 40 00 00 .....?...@...@.. +| 1824: 00 40 40 00 00 00 00 00 00 00 00 04 b0 00 00 00 .@@............. +| 1840: 00 3f 80 00 00 40 00 00 00 40 40 00 00 00 00 00 .?...@...@@..... +| 1856: 00 00 00 05 17 40 40 00 00 40 80 00 00 40 40 00 .....@@..@...@@. +| 1872: 00 40 80 00 00 00 00 00 00 00 00 05 16 40 00 00 .@...........@.. +| 1888: 00 40 40 00 00 40 40 00 00 40 80 00 00 00 00 00 .@@..@@..@...... +| 1904: 00 00 00 05 15 3f 80 00 00 40 00 00 00 40 40 00 .....?...@...@@. +| 1920: 00 40 80 00 00 00 00 00 00 00 00 05 14 00 00 00 .@.............. +| 1936: 00 3f 80 00 00 40 40 00 00 40 80 00 00 00 00 00 .?...@@..@...... +| 1952: 00 00 00 05 7b 40 40 00 00 40 80 00 00 40 80 00 .....@@..@...@.. +| 1968: 00 40 a0 00 00 00 00 00 00 00 00 05 7a 40 00 00 .@..........z@.. +| 1984: 00 40 40 00 00 40 80 00 00 40 a0 00 00 00 00 00 .@@..@...@...... +| 2000: 00 00 00 05 79 3f 80 00 00 40 00 00 00 40 80 00 ....y?...@...@.. +| 2016: 00 40 a0 00 00 00 00 00 00 00 00 05 78 00 00 00 .@..........x... +| 2032: 00 3f 80 00 00 40 80 00 00 40 a0 00 00 00 00 00 .?...@...@...... +| 2048: 00 00 00 05 df 40 40 00 00 40 80 00 00 40 a0 00 .....@@..@...@.. +| 2064: 00 40 c0 00 00 00 00 00 00 00 00 05 de 40 00 00 .@...........@.. +| 2080: 00 40 40 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .@@..@...@...... +| 2096: 00 00 00 05 dd 3f 80 00 00 40 00 00 00 40 a0 00 .....?...@...@.. +| 2112: 00 40 c0 00 00 00 00 00 00 00 00 05 dc 00 00 00 .@.............. +| 2128: 00 3f 80 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .?...@...@...... +| 2144: 00 00 00 06 43 40 40 00 00 40 80 00 00 40 c0 00 ....C@@..@...@.. +| 2160: 00 40 e0 00 00 00 00 00 00 00 00 06 42 40 00 00 .@..........B@.. +| 2176: 00 40 40 00 00 40 c0 00 00 40 e0 00 00 00 00 00 .@@..@...@...... +| 2192: 00 00 00 06 41 3f 80 00 00 40 00 00 00 40 c0 00 ....A?...@...@.. +| 2208: 00 40 e0 00 00 00 00 00 00 00 00 06 40 00 00 00 .@..........@... +| 2224: 00 3f 80 00 00 40 c0 00 00 40 e0 00 00 00 00 00 .?...@...@...... +| 2240: 00 00 00 06 a7 40 40 00 00 40 80 00 00 40 e0 00 .....@@..@...@.. +| 2256: 00 41 00 00 00 00 00 00 00 00 00 06 a6 40 00 00 .A...........@.. +| 2272: 00 40 40 00 00 40 e0 00 00 41 00 00 00 00 00 00 .@@..@...A...... +| 2288: 00 00 00 06 a5 3f 80 00 00 40 00 00 00 40 e0 00 .....?...@...@.. +| 2304: 00 41 00 00 00 00 00 00 00 00 00 06 a4 00 00 00 .A.............. +| 2320: 00 3f 80 00 00 40 e0 00 00 41 00 00 00 00 00 00 .?...@...A...... +| 2336: 00 00 00 07 0a 40 00 00 00 40 40 00 00 41 00 00 .....@...@@..A.. +| 2352: 00 41 10 00 00 00 00 00 00 00 00 07 09 3f 80 00 .A...........?.. +| 2368: 00 40 00 00 00 41 00 00 00 41 10 00 00 00 00 00 .@...A...A...... +| 2384: 00 00 00 07 08 00 00 00 00 3f 80 00 00 41 00 00 .........?...A.. +| 2400: 00 41 10 00 00 00 00 00 00 00 00 07 6e 40 00 00 .A..........n@.. +| 2416: 00 40 40 00 00 41 10 00 00 41 20 00 00 00 00 00 .@@..A...A ..... +| 2432: 00 00 00 07 6d 3f 80 00 00 40 00 00 00 41 10 00 ....m?...@...A.. +| 2448: 00 41 20 00 00 00 00 00 00 00 00 07 6c 00 00 00 .A .........l... +| 2464: 00 3f 80 00 00 41 10 00 00 41 20 00 00 00 00 00 .?...A...A ..... +| 2480: 00 00 00 07 0b 40 40 00 00 40 80 00 00 41 00 00 .....@@..@...A.. +| 2496: 00 41 10 00 00 00 00 00 00 00 00 07 6f 40 40 00 .A..........o@@. +| 2512: 00 40 80 00 00 41 10 00 00 41 20 00 00 00 00 00 .@...A...A ..... +| 2528: 00 00 00 03 ec 40 80 00 00 40 a0 00 00 00 00 00 .....@...@...... +| 2544: 00 3f 80 00 00 00 00 00 00 00 00 04 50 40 80 00 .?..........P@.. +| 2560: 00 40 a0 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@...?...@...... +| 2576: 00 00 00 04 b4 40 80 00 00 40 a0 00 00 40 00 00 .....@...@...@.. +| 2592: 00 40 40 00 00 00 00 00 00 00 00 05 18 40 80 00 .@@..........@.. +| 2608: 00 40 a0 00 00 40 40 00 00 40 80 00 00 00 00 00 .@...@@..@...... +| 2624: 00 00 00 05 7c 40 80 00 00 40 a0 00 00 40 80 00 ....|@...@...@.. +| 2640: 00 40 a0 00 00 00 00 00 00 00 00 05 e0 40 80 00 .@...........@.. +| 2656: 00 40 a0 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .@...@...@...... +| 2672: 00 00 00 06 44 40 80 00 00 40 a0 00 00 40 c0 00 ....D@...@...@.. +| 2688: 00 40 e0 00 00 00 00 00 00 00 00 06 a8 40 80 00 .@...........@.. +| 2704: 00 40 a0 00 00 40 e0 00 00 41 00 00 00 00 00 00 .@...@...A...... +| 2720: 00 00 00 07 0c 40 80 00 00 40 a0 00 00 41 00 00 .....@...@...A.. +| 2736: 00 41 10 00 00 00 00 00 00 00 00 07 70 40 80 00 .A..........p@.. +| 2752: 00 40 a0 00 00 41 10 00 00 41 20 00 00 00 00 00 .@...A...A ..... +| 2768: 00 00 00 03 ed 40 a0 00 00 40 c0 00 00 00 00 00 .....@...@...... +| 2784: 00 3f 80 00 00 00 00 00 00 00 00 04 51 40 a0 00 .?..........Q@.. +| 2800: 00 40 c0 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@...?...@...... +| 2816: 00 00 00 04 b5 40 a0 00 00 40 c0 00 00 40 00 00 .....@...@...@.. +| 2832: 00 40 40 00 00 00 00 00 00 00 00 05 19 40 a0 00 .@@..........@.. +| 2848: 00 40 c0 00 00 40 40 00 00 40 80 00 00 89 50 01 .@...@@..@....P. +| 2864: 04 00 93 24 00 01 00 02 00 00 00 00 00 00 00 03 ...$............ +| 2880: 00 00 00 00 40 80 00 00 00 00 00 00 3f 80 00 00 ....@.......?... +| 2896: 00 00 00 00 00 00 00 02 00 00 00 00 41 20 00 00 ............A .. +| 2912: 00 00 00 00 41 20 00 00 00 00 00 00 00 00 00 00 ....A .......... +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 05 03 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 03 01 87 00 0b 2d 06 5a 01 87 00 00 .........-.Z.... +| 384: 00 00 00 00 00 00 00 89 50 03 04 00 93 24 00 00 ........P....$.. +| 400: 00 11 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 688: 00 00 00 00 42 c8 00 00 42 4c 00 00 42 00 00 00 ....B...BL..B... +| 720: 03 eb 40 40 00 00 40 80 00 00 00 00 00 00 3f 80 ..@@..@.......?. +| 736: 00 00 00 00 00 00 00 00 03 ea 40 00 00 00 40 40 ..........@...@@ +| 752: 00 00 00 00 00 00 3f 80 00 00 00 00 00 00 00 00 ......?......... +| 768: 03 e9 3f 80 00 00 40 00 00 00 00 00 00 00 3f 80 ..?...@.......?. +| 784: 00 00 00 00 00 00 00 00 03 e8 00 00 00 00 3f 80 ..............?. +| 800: 00 00 00 00 00 00 3f 80 00 00 00 00 00 00 00 00 ......?......... +| 1616: 00 00 00 00 00 00 00 00 00 00 89 50 02 04 00 93 ...........P.... +| 1632: 24 00 00 00 2d 00 00 00 00 00 00 04 4c 00 00 00 $...-.......L... +| 1648: 00 3f 80 00 00 3f 80 00 00 40 00 00 00 00 00 00 .?...?...@...... +| 1664: 00 00 00 04 b0 00 00 00 00 3f 80 00 00 40 00 00 .........?...@.. +| 1680: 00 40 40 00 00 00 00 00 00 00 00 05 14 00 00 00 .@@............. +| 1696: 00 3f 80 00 00 40 40 00 00 40 80 00 00 00 00 00 .?...@@..@...... +| 1712: 00 00 00 05 78 00 00 00 00 3f 80 00 00 40 80 00 ....x....?...@.. +| 1728: 00 40 a0 00 00 00 00 00 00 00 00 05 dc 00 00 00 .@.............. +| 1744: 00 3f 80 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .?...@...@...... +| 1760: 00 00 00 00 01 00 00 00 00 41 20 00 00 00 00 00 .........A ..... +| 1776: 00 41 0e 00 00 00 00 00 00 00 00 04 4d 3f 80 00 .A..........M?.. +| 1792: 00 40 00 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@...?...@...... +| 1808: 00 00 00 04 b1 3f 80 00 00 40 00 00 00 40 00 00 .....?...@...@.. +| 1824: 00 40 40 00 00 00 00 00 00 00 00 05 15 3f 80 00 .@@..........?.. +| 1840: 00 40 00 00 00 40 40 00 00 40 80 00 00 00 00 00 .@...@@..@...... +| 1856: 00 00 00 05 79 3f 80 00 00 40 00 00 00 40 80 00 ....y?...@...@.. +| 1872: 00 40 a0 00 00 00 00 00 00 00 00 05 dd 3f 80 00 .@...........?.. +| 1888: 00 40 00 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .@...@...@...... +| 1904: 00 00 00 04 4e 40 00 00 00 40 40 00 00 3f 80 00 ....N@...@@..?.. +| 1920: 00 40 00 00 00 00 00 00 00 00 00 04 b2 40 00 00 .@...........@.. +| 1936: 00 40 40 00 00 40 00 00 00 40 40 00 00 00 00 00 .@@..@...@@..... +| 1952: 00 00 00 05 16 40 00 00 00 40 40 00 00 40 40 00 .....@...@@..@@. +| 1968: 00 40 80 00 00 00 00 00 00 00 00 05 7a 40 00 00 .@..........z@.. +| 1984: 00 40 40 00 00 40 80 00 00 40 a0 00 00 00 00 00 .@@..@...@...... +| 2000: 00 00 00 05 de 40 00 00 00 40 40 00 00 40 a0 00 .....@...@@..@.. +| 2016: 00 40 c0 00 00 00 00 00 00 00 00 04 4f 40 40 00 .@..........O@@. +| 2032: 00 40 80 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@...?...@...... +| 2048: 00 00 00 04 b3 40 40 00 00 40 80 00 00 40 00 00 .....@@..@...@.. +| 2064: 00 40 40 00 00 00 00 00 00 00 00 05 17 40 40 00 .@@..........@@. +| 2080: 00 40 80 00 00 40 40 00 00 40 80 00 00 00 00 00 .@...@@..@...... +| 2096: 00 00 00 05 7b 40 40 00 00 40 80 00 00 40 80 00 .....@@..@...@.. +| 2112: 00 40 a0 00 00 00 00 00 00 00 00 05 df 40 40 00 .@...........@@. +| 2128: 00 40 80 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .@...@...@...... +| 2144: 00 00 00 03 ec 40 80 00 00 40 a0 00 00 00 00 00 .....@...@...... +| 2160: 00 3f 80 00 00 00 00 00 00 00 00 04 50 40 80 00 .?..........P@.. +| 2176: 00 40 a0 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@...?...@...... +| 2192: 00 00 00 04 b4 40 80 00 00 40 a0 00 00 40 00 00 .....@...@...@.. +| 2208: 00 40 40 00 00 00 00 00 00 00 00 05 18 40 80 00 .@@..........@.. +| 2224: 00 40 a0 00 00 40 40 00 00 40 80 00 00 00 00 00 .@...@@..@...... +| 2240: 00 00 00 05 7c 40 80 00 00 40 a0 00 00 40 80 00 ....|@...@...@.. +| 2256: 00 40 a0 00 00 00 00 00 00 00 00 05 e0 40 80 00 .@...........@.. +| 2272: 00 40 a0 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .@...@...@...... +| 2288: 00 00 00 03 f0 41 00 00 00 41 10 00 00 00 00 00 .....A...A...... +| 2304: 00 3f 80 00 00 00 00 00 00 00 00 04 54 41 00 00 .?..........TA.. +| 2320: 00 41 10 00 00 3f 80 00 00 40 00 00 00 00 00 00 .A...?...@...... +| 2336: 00 00 00 04 b8 41 00 00 00 41 10 00 00 40 00 00 .....A...A...@.. +| 2352: 00 40 40 00 00 00 00 00 00 00 00 05 1c 41 00 00 .@@..........A.. +| 2368: 00 41 10 00 00 40 40 00 00 40 80 00 00 00 00 00 .A...@@..@...... +| 2384: 00 00 00 05 80 41 00 00 00 41 10 00 00 40 80 00 .....A...A...@.. +| 2400: 00 40 a0 00 00 00 00 00 00 00 00 05 e4 41 00 00 .@...........A.. +| 2416: 00 41 10 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .A...@...@...... +| 2432: 00 00 00 06 48 41 00 00 00 41 10 00 00 40 c0 00 ....HA...A...@.. +| 2448: 00 40 e0 00 00 00 00 00 00 00 00 06 ac 41 00 00 .@...........A.. +| 2464: 00 41 10 00 00 40 e0 00 00 41 00 00 00 00 00 00 .A...@...A...... +| 2480: 00 00 00 07 10 41 00 00 00 41 10 00 00 41 00 00 .....A...A...A.. +| 2496: 00 41 10 00 00 00 00 00 00 00 00 03 f1 41 10 00 .A...........A.. +| 2512: 00 41 20 00 00 00 00 00 00 3f 80 00 00 00 00 00 .A ......?...... +| 2528: 00 00 00 04 55 41 10 00 00 41 20 00 00 3f 80 00 ....UA...A ..?.. +| 2544: 00 40 00 00 00 00 00 00 00 00 00 04 b9 41 10 00 .@...........A.. +| 2560: 00 41 20 00 00 40 00 00 00 40 40 00 00 00 00 00 .A ..@...@@..... +| 2576: 00 00 00 05 1d 41 10 00 00 41 20 00 00 40 40 00 .....A...A ..@@. +| 2592: 00 40 80 00 00 00 00 00 00 00 00 05 81 41 10 00 .@...........A.. +| 2608: 00 41 20 00 00 40 80 00 00 40 a0 00 00 00 00 00 .A ..@...@...... +| 2624: 00 00 00 05 e5 41 10 00 00 41 20 00 00 40 a0 00 .....A...A ..@.. +| 2640: 00 40 c0 00 00 00 00 00 00 00 00 06 49 41 10 00 .@..........IA.. +| 2656: 00 41 20 00 00 40 c0 00 00 40 e0 00 00 00 00 00 .A ..@...@...... +| 2672: 00 00 00 06 ad 41 10 00 00 41 20 00 00 40 e0 00 .....A...A ..@.. +| 2688: 00 41 00 00 00 00 00 00 00 00 00 07 11 41 10 00 .A...........A.. +| 2704: 00 41 20 00 00 41 00 00 00 41 10 00 00 00 00 00 .A ..A...A...... +| 2848: 00 00 00 00 00 00 00 00 00 00 00 00 00 89 50 01 ..............P. +| 2864: 04 00 93 24 00 01 00 04 00 00 00 00 00 00 00 03 ...$............ +| 2880: 00 00 00 00 40 80 00 00 00 00 00 00 3f 80 00 00 ....@.......?... +| 2896: 00 00 00 00 00 00 00 02 00 00 00 00 41 20 00 00 ............A .. +| 2912: 00 00 00 00 41 10 00 00 00 00 00 00 00 00 00 04 ....A........... +| 2928: 00 00 00 00 41 20 00 00 40 c0 00 00 41 20 00 00 ....A ..@...A .. +| 2944: 00 00 00 00 00 00 00 05 40 a0 00 00 41 00 00 00 ........@...A... +| 2960: 00 00 00 00 41 20 00 00 00 00 00 00 00 00 00 00 ....A .......... +| page 6 offset 20480 +| 0: 0d 00 00 00 02 06 5a 00 0b 2d 06 5a 00 00 00 00 ......Z..-.Z.... +| 1616: 00 00 00 00 00 00 00 00 00 00 89 50 05 04 00 93 ...........P.... +| 1632: 24 00 00 00 1c 00 00 00 00 00 00 03 ed 40 a0 00 $............@.. +| 1648: 00 40 c0 00 00 00 00 00 00 3f 80 00 00 00 00 00 .@.......?...... +| 1664: 00 00 00 04 51 40 a0 00 00 40 c0 00 00 3f 80 00 ....Q@...@...?.. +| 1680: 00 40 00 00 00 00 00 00 00 00 00 04 b5 40 a0 00 .@...........@.. +| 1696: 00 40 c0 00 00 40 00 00 00 40 40 00 00 00 00 00 .@...@...@@..... +| 1712: 00 00 00 05 19 40 a0 00 00 40 c0 00 00 40 40 00 .....@...@...@@. +| 1728: 00 40 80 00 00 00 00 00 00 00 00 05 7d 40 a0 00 .@...........@.. +| 1744: 00 40 c0 00 00 40 80 00 00 40 a0 00 00 00 00 00 .@...@...@...... +| 1760: 00 00 00 05 e1 40 a0 00 00 40 c0 00 00 40 a0 00 .....@...@...@.. +| 1776: 00 40 c0 00 00 00 00 00 00 00 00 06 45 40 a0 00 .@..........E@.. +| 1792: 00 40 c0 00 00 40 c0 00 00 40 e0 00 00 00 00 00 .@...@...@...... +| 1808: 00 00 00 06 a9 40 a0 00 00 40 c0 00 00 40 e0 00 .....@...@...@.. +| 1824: 00 41 00 00 00 00 00 00 00 00 00 07 0d 40 a0 00 .A...........@.. +| 1840: 00 40 c0 00 00 41 00 00 00 41 10 00 00 00 00 00 .@...A...A...... +| 1856: 00 00 00 03 ee 40 c0 00 00 40 e0 00 00 00 00 00 .....@...@...... +| 1872: 00 3f 80 00 00 00 00 00 00 00 00 04 52 40 c0 00 .?..........R@.. +| 1888: 00 40 e0 00 00 3f 80 00 00 40 00 00 00 00 00 00 .@...?...@...... +| 1904: 00 00 00 04 b6 40 c0 00 00 40 e0 00 00 40 00 00 .....@...@...@.. +| 1920: 00 40 40 00 00 00 00 00 00 00 00 05 1a 40 c0 00 .@@..........@.. +| 1936: 00 40 e0 00 00 40 40 00 00 40 80 00 00 00 00 00 .@...@@..@...... +| 1952: 00 00 00 05 7e 40 c0 00 00 40 e0 00 00 40 80 00 ....~@...@...@.. +| 1968: 00 40 a0 00 00 00 00 00 00 00 00 05 e2 40 c0 00 .@...........@.. +| 1984: 00 40 e0 00 00 40 a0 00 00 40 c0 00 00 00 00 00 .@...@...@...... +| 2000: 00 00 00 06 46 40 c0 00 00 40 e0 00 00 40 c0 00 ....F@...@...@.. +| 2016: 00 40 e0 00 00 00 00 00 00 00 00 06 aa 40 c0 00 .@...........@.. +| 2032: 00 40 e0 00 00 40 e0 00 00 41 00 00 00 00 00 00 .@...@...A...... +| 2048: 00 00 00 07 0e 40 c0 00 00 40 e0 00 00 41 00 00 .....@...@...A.. +| 2064: 00 41 10 00 00 00 00 00 00 00 00 03 ef 40 e0 00 .A...........@.. +| 2080: 00 41 00 00 00 00 00 00 00 3f 80 00 00 00 00 00 .A.......?...... +| 2096: 00 00 00 04 53 40 e0 00 00 41 00 00 00 3f 80 00 ....S@...A...?.. +| 2112: 00 40 00 00 00 00 00 00 00 00 00 04 b7 40 e0 00 .@...........@.. +| 2128: 00 41 00 00 00 40 00 00 00 40 40 00 00 00 00 00 .A...@...@@..... +| 2144: 00 00 00 05 1b 40 e0 00 00 41 00 00 00 40 40 00 .....@...A...@@. +| 2160: 00 40 80 00 00 00 00 00 00 00 00 05 7f 40 e0 00 .@...........@.. +| 2176: 00 41 00 00 00 40 80 00 00 40 a0 00 00 00 00 00 .A...@...@...... +| 2192: 00 00 00 05 e3 40 e0 00 00 41 00 00 00 40 a0 00 .....@...A...@.. +| 2208: 00 40 c0 00 00 00 00 00 00 00 00 06 47 40 e0 00 .@..........G@.. +| 2224: 00 41 00 00 00 40 c0 00 00 40 e0 00 00 00 00 00 .A...@...@...... +| 2240: 00 00 00 06 ab 40 e0 00 00 41 00 00 00 40 e0 00 .....@...A...@.. +| 2256: 00 41 00 00 00 00 00 00 00 00 00 07 0f 40 e0 00 .A...........@.. +| 2272: 00 41 00 00 00 41 00 00 00 41 10 00 00 00 00 00 .A...A...A...... +| 2288: 00 00 00 07 73 40 e0 00 00 41 00 00 00 41 10 00 ....s@...A...A.. +| 2304: 00 41 20 00 00 00 00 00 00 00 00 00 00 00 00 00 .A ............. +| 2848: 00 00 00 00 00 00 00 00 00 00 00 00 00 89 50 04 ..............P. +| 2864: 04 00 93 24 00 00 00 18 00 00 00 00 00 00 06 43 ...$...........C +| 2880: 40 40 00 00 40 80 00 00 40 c0 00 00 40 e0 00 00 @@..@...@...@... +| 2896: 00 00 00 00 00 00 06 42 40 00 00 00 40 40 00 00 .......B@...@@.. +| 2912: 40 c0 00 00 40 e0 00 00 00 00 00 00 00 00 06 41 @...@..........A +| 2928: 3f 80 00 00 40 00 00 00 40 c0 00 00 40 e0 00 00 ?...@...@...@... +| 2944: 00 00 00 00 00 00 06 40 00 00 00 00 3f 80 00 00 .......@....?... +| 2960: 40 c0 00 00 40 e0 00 00 00 00 00 00 00 00 06 44 @...@..........D +| 2976: 40 80 00 00 40 a0 00 00 40 c0 00 00 40 e0 00 00 @...@...@...@... +| 2992: 00 00 00 00 00 00 06 a7 40 40 00 00 40 80 00 00 ........@@..@... +| 3008: 40 e0 00 00 41 00 00 00 00 00 00 00 00 00 06 a6 @...A........... +| 3024: 40 00 00 00 40 40 00 00 40 e0 00 00 41 00 00 00 @...@@..@...A... +| 3040: 00 00 00 00 00 00 06 a5 3f 80 00 00 40 00 00 00 ........?...@... +| 3056: 40 e0 00 00 41 00 00 00 00 00 00 00 00 00 06 a4 @...A........... +| 3072: 00 00 00 00 3f 80 00 00 40 e0 00 00 41 00 00 00 ....?...@...A... +| 3088: 00 00 00 00 00 00 06 a8 40 80 00 00 40 a0 00 00 ........@...@... +| 3104: 40 e0 00 00 41 00 00 00 00 00 00 00 00 00 07 0a @...A........... +| 3120: 40 00 00 00 40 40 00 00 41 00 00 00 41 10 00 00 @...@@..A...A... +| 3136: 00 00 00 00 00 00 07 09 3f 80 00 00 40 00 00 00 ........?...@... +| 3152: 41 00 00 00 41 10 00 00 00 00 00 00 00 00 07 08 A...A........... +| 3168: 00 00 00 00 3f 80 00 00 41 00 00 00 41 10 00 00 ....?...A...A... +| 3184: 00 00 00 00 00 00 07 0b 40 40 00 00 40 80 00 00 ........@@..@... +| 3200: 41 00 00 00 41 10 00 00 00 00 00 00 00 00 07 0c A...A........... +| 3216: 40 80 00 00 40 a0 00 00 41 00 00 00 41 10 00 00 @...@...A...A... +| 3232: 00 00 00 00 00 00 07 6e 40 00 00 00 40 40 00 00 .......n@...@@.. +| 3248: 41 10 00 00 41 20 00 00 00 00 00 00 00 00 07 6d A...A .........m +| 3264: 3f 80 00 00 40 00 00 00 41 10 00 00 41 20 00 00 ?...@...A...A .. +| 3280: 00 00 00 00 00 00 07 6c 00 00 00 00 3f 80 00 00 .......l....?... +| 3296: 41 10 00 00 41 20 00 00 00 00 00 00 00 00 07 6f A...A .........o +| 3312: 40 40 00 00 40 80 00 00 41 10 00 00 41 20 00 00 @@..@...A...A .. +| 3328: 00 00 00 00 00 00 07 70 40 80 00 00 40 a0 00 00 .......p@...@... +| 3344: 41 10 00 00 41 20 00 00 00 00 00 00 00 00 07 71 A...A .........q +| 3360: 40 a0 00 00 40 c0 00 00 41 10 00 00 41 20 00 00 @...@...A...A .. +| 3376: 00 00 00 00 00 00 07 72 40 c0 00 00 40 e0 00 00 .......r@...@... +| 3392: 41 10 00 00 41 20 00 00 00 00 00 00 00 00 07 74 A...A .........t +| 3408: 41 00 00 00 41 10 00 00 41 10 00 00 41 20 00 00 A...A...A...A .. +| 3424: 00 00 00 00 00 00 07 75 41 10 00 00 41 20 00 00 .......uA...A .. +| 3440: 41 10 00 00 41 20 00 00 00 00 00 00 00 00 00 00 A...A .......... +| end c1b.db + }] + catchsql { + SELECT rtreecheck('t1'); + } +} {1 {SQL logic error}} + +do_test rtreefuzz001-200 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 16384 pagesize 4096 filename c3.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 04 .....@ ........ +| 32: 00 00 00 00 01 00 00 00 00 00 00 04 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 04 0e 9c 00 0f ad 0f 4f ...............O +| 112: 0e fc 0e 9c 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3728: 00 00 00 00 00 00 00 00 00 00 00 00 5e 04 07 17 ............^... +| 3744: 1f 1f 01 81 0b 74 61 62 6c 65 74 31 5f 70 61 72 .....tablet1_par +| 3760: 65 6e 74 74 31 5f 70 61 72 65 6e 74 04 43 52 45 entt1_parent.CRE +| 3776: 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 70 61 ATE TABLE .t1_pa +| 3792: 72 65 6e 74 22 28 6e 6f 64 65 6e 6f 20 49 4e 54 rent.(nodeno INT +| 3808: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3824: 2c 70 61 72 65 6e 74 6e 6f 64 65 29 51 03 06 17 ,parentnode)Q... +| 3840: 1b 1b 01 7b 74 61 62 6c 65 74 31 5f 6e 6f 64 65 ....tablet1_node +| 3856: 74 31 5f 6e 6f 64 65 03 43 52 45 41 54 45 20 54 t1_node.CREATE T +| 3872: 41 42 4c 45 20 22 74 31 5f 6e 6f 64 65 22 28 6e ABLE .t1_node.(n +| 3888: 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 odeno INTEGER PR +| 3904: 49 4d 41 52 59 20 4b 45 59 2c 64 61 74 61 29 5c IMARY KEY,data). +| 3920: 02 07 17 1d 1d 01 81 0b 74 61 62 6c 65 74 31 5f ........tablet1_ +| 3936: 72 6f 77 69 64 74 31 5f 72 6f 77 69 64 02 43 52 rowidt1_rowid.CR +| 3952: 45 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 72 EATE TABLE .t1_r +| 3968: 6f 77 69 64 22 28 72 6f 77 69 64 20 49 4e 54 45 owid.(rowid INTE +| 3984: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY, +| 4000: 6e 6f 64 65 6e 6f 2c 61 30 2c 61 31 29 51 01 07 nodeno,a0,a1)Q.. +| 4016: 17 11 11 08 81 0f 74 61 62 6c 65 74 31 74 31 43 ......tablet1t1C +| 4032: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 4048: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 72 74 72 BLE t1 USING rtr +| 4064: 65 65 28 69 64 2c 78 30 2c 78 31 2c 79 30 2c 79 ee(id,x0,x1,y0,y +| 4080: 31 2c 2b 6c 61 62 65 6c 2c 2b 6f 74 68 65 72 29 1,+label,+other) +| page 2 offset 4096 +| 0: 0d 00 00 00 0e 0e f7 00 0f e8 0f d0 0f b7 0f 9e ................ +| 16: 0f 91 0f 81 0f 70 0f 5e 0f 4f 0f 39 0f 29 0f 18 .....p.^.O.9.).. +| 32: 0f 06 0e f7 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3824: 00 00 00 00 00 00 00 0d 0e 05 00 09 1d 00 74 6f ..............to +| 3840: 70 20 68 61 6c 66 10 0d 05 00 09 23 00 62 6f 74 p half.....#.bot +| 3856: 74 6f 6d 20 68 61 6c 66 0f 0c 05 00 09 21 00 72 tom half.....!.r +| 3872: 69 67 68 74 20 68 61 6c 66 0e 0b 05 00 09 1f 00 ight half....... +| 3888: 6c 65 66 74 20 68 61 6c 66 14 0a 05 00 09 2b 00 left half.....+. +| 3904: 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 0d the whole thing. +| 3920: 09 05 00 09 1d 00 74 6f 70 20 65 64 67 65 10 08 ......top edge.. +| 3936: 05 00 09 23 00 62 6f 74 74 6f 6d 20 65 64 67 65 ...#.bottom edge +| 3952: 0f 07 05 00 09 21 00 72 69 67 68 74 20 65 64 67 .....!.right edg +| 3968: 65 0e 06 05 00 09 1f 00 6c 65 66 74 20 65 64 67 e.......left edg +| 3984: 65 0b 05 05 00 09 19 00 63 65 6e 74 65 72 17 04 e.......center.. +| 4000: 05 00 09 31 00 75 70 70 65 72 2d 72 69 67 68 74 ...1.upper-right +| 4016: 20 63 6f 72 6e 65 72 17 03 05 00 09 31 00 6c 6f corner.....1.lo +| 4032: 77 65 72 2d 72 69 67 68 74 27 60 f6 32 6e 65 72 wer-right'`.2ner +| 4048: 16 02 05 00 09 2f 00 75 70 70 65 72 2d 6c 65 66 ...../.upper-lef +| 4064: 74 20 63 6f 72 6e 65 72 16 01 05 00 09 2f 00 6c t corner...../.l +| 4080: 6f 77 65 72 2d 6c 65 66 74 20 63 6f 72 6e 65 72 ower-left corner +| page 3 offset 8192 +| 0: 0d 00 00 00 02 0b 2d 00 0b 2d 00 00 00 00 00 00 ......-..-...... +| 2848: 00 00 00 00 00 00 00 00 00 00 00 00 00 89 50 01 ..............P. +| 2864: 04 00 93 24 00 00 00 0e 00 00 00 00 00 00 00 01 ...$............ +| 2880: 00 00 00 00 41 20 00 00 00 00 00 00 41 20 01 00 ....A ......A .. +| 2896: 00 00 00 00 00 00 00 02 00 00 00 00 41 00 00 04 ............A... +| 2912: 2b 40 00 0c 42 c8 00 00 00 00 00 00 00 00 00 03 +@..B........... +| 2928: 42 b4 00 00 42 c8 00 00 00 00 00 00 41 20 00 00 B...B.......A .. +| 2944: 00 00 00 00 00 00 00 04 42 b4 00 00 42 c8 00 00 ........B...B... +| 2960: 42 b4 00 00 42 c8 00 00 00 00 00 00 00 00 00 05 B...B........... +| 2976: 42 20 00 00 42 70 00 00 42 20 00 00 42 70 00 00 B ..Bp..B ..Bp.. +| 2992: 00 00 00 00 00 00 00 60 00 00 00 04 0a 00 00 00 .......`........ +| 3008: 00 00 00 42 c8 00 00 00 00 00 00 00 00 00 07 42 ...B...........B +| 3024: be 00 00 42 c8 00 00 00 00 00 00 42 c8 00 00 00 ...B.......B.... +| 3040: 00 00 00 00 00 00 08 00 00 00 00 42 c8 00 00 00 ...........B.... +| 3056: 00 00 00 40 a0 00 00 00 00 00 00 00 00 00 09 00 ...@............ +| 3072: 00 00 00 42 c8 00 00 42 be 00 00 42 c8 00 00 00 ...B...B...B.... +| 3088: 00 00 00 00 00 00 0a 00 00 00 00 42 c8 00 00 00 ...........B.... +| 3104: 00 00 00 42 c8 00 00 00 00 00 00 00 00 00 0b 00 ...B............ +| 3120: 00 00 00 42 48 00 00 00 00 00 04 2c 80 00 00 00 ...BH......,.... +| 3136: 00 00 00 00 00 00 c4 24 c0 00 04 2c 80 00 00 00 .......$...,.... +| 3152: 00 00 04 2c 80 00 00 00 00 00 00 00 00 00 d0 00 ...,............ +| 3168: 00 00 04 2c 80 00 00 00 00 00 04 24 80 00 00 00 ...,.......$.... +| 3184: 00 00 00 00 00 00 e0 00 00 00 04 2c 80 00 04 24 ...........,...$ +| 3200: c0 00 04 2c 00 00 00 00 00 00 00 00 00 00 00 00 ...,............ +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| end c3.db + }] + catchsql { + WITH RECURSIVE + c1(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c1 WHERE x<99), + c2(y) AS (VALUES(0) UNION ALL SELECT y+1 FROM c2 WHERE y<99) + INSERT INTO t1(id, x0,x1,y0,y1,label) + SELECT 1000+x+y*100, x, x+1, y, y+1, printf('box-%d,%d',x,y) FROM c1, c2; + } +} {1 {database disk image is malformed}} +do_test rtreefuzz001-210 { + catchsql { + SELECT rtreecheck('t1'); + } +} {/1 .*corrupt.*/} + +do_test rtreefuzz001-300 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 16384 pagesize 4096 filename c4.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 04 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 04 00 00 00 04 ................ +| 96: 00 00 00 00 0d 00 00 00 04 0e 9c 00 0f ad 0f 4f ...............O +| 112: 0e fc 0e 9c 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3728: 00 00 00 00 00 00 00 00 00 00 00 00 5e 04 07 17 ............^... +| 3744: 1f 1f 01 81 0b 74 61 62 6c 65 74 31 5f 70 61 72 .....tablet1_par +| 3760: 65 6e 74 74 31 5f 70 61 72 65 6e 74 04 43 52 45 entt1_parent.CRE +| 3776: 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 70 61 ATE TABLE .t1_pa +| 3792: 72 65 6e 74 22 28 6e 6f 64 65 6e 6f 20 49 4e 54 rent.(nodeno INT +| 3808: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3824: 2c 70 61 72 65 6e 74 6e 6f 64 65 29 51 03 06 17 ,parentnode)Q... +| 3840: 1b 1b 01 7b 74 61 62 6c 65 74 31 5f 6e 6f 64 65 ....tablet1_node +| 3856: 74 31 5f 6e 6f 64 65 03 43 52 45 41 54 45 20 54 t1_node.CREATE T +| 3872: 41 42 4c 45 20 22 74 31 5f 6e 6f 64 65 22 28 6e ABLE .t1_node.(n +| 3888: 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 odeno INTEGER PR +| 3904: 49 4d 41 52 59 20 4b 45 59 2c 64 61 74 61 29 5c IMARY KEY,data). +| 3920: 02 07 17 1d 1d 01 81 0b 74 61 62 6c 65 74 31 5f ........tablet1_ +| 3936: 72 6f 77 69 64 74 31 5f 72 6f 77 69 64 02 43 52 rowidt1_rowid.CR +| 3952: 45 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 72 EATE TABLE .t1_r +| 3968: 6f 77 69 64 22 28 72 6f 77 69 64 20 49 4e 54 45 owid.(rowid INTE +| 3984: 47 45 72 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GEr PRIMARY KEY, +| 4000: 6e 6f 64 65 6e 6f 2c 61 30 2c 61 31 29 51 01 07 nodeno,a0,a1)Q.. +| 4016: 17 11 11 08 81 0f 74 61 62 6c 65 74 31 74 31 43 ......tablet1t1C +| 4032: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 4048: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 72 74 72 BLE t1 USING rtr +| 4064: 65 65 28 69 64 2c 78 30 2c 78 31 2c 79 30 2c 79 ee(id,x0,x1,y0,y +| 4080: 31 2c 2b 6c 61 62 65 6c 2c 2b 6f 74 68 65 72 29 1,+label,+other) +| page 2 offset 4096 +| 0: 0d 00 00 00 0e 0e f7 00 0f e8 0f 00 fb 70 f9 e0 .............p.. +| 16: f9 10 f8 10 f7 00 f5 e0 f4 f0 f3 90 f2 90 f1 80 ................ +| 32: f0 60 ef 00 00 00 00 00 00 00 00 00 00 00 00 00 .`.............. +| 3824: 00 00 00 00 00 00 00 0d 0e 05 00 09 1d 00 74 6f ..............to +| 3840: 70 20 68 61 6c 66 10 0d 05 00 09 23 00 62 6f 74 p half.....#.bot +| 3856: 74 6f 6d 20 68 61 6c 66 0f 0c 05 00 09 21 00 72 tom half.....!.r +| 3872: 69 67 68 74 20 68 61 6c 66 0e 0b 05 00 09 1f 00 ight half....... +| 3888: 6c 65 66 74 20 68 61 6c 66 14 0a 05 00 09 2b 00 left half.....+. +| 3904: 00 03 98 20 49 98 2f 6c 62 05 74 68 69 6e 67 0d ... I./lb.thing. +| 3920: 09 05 00 09 1d 00 74 6f 70 20 65 64 67 65 10 08 ......top edge.. +| 3936: 05 00 09 23 00 62 6f 74 74 6f 6d 20 65 64 67 65 ...#.bottom edge +| 3952: 0f 07 05 00 09 21 00 72 69 67 68 74 20 65 64 67 .....!.right edg +| 3968: 65 0e 06 05 00 09 1f 00 6c 65 66 74 20 65 64 67 e.......left edg +| 3984: 65 0b 05 05 00 09 19 00 63 65 6e 74 65 72 17 04 e.......center.. +| 4000: 05 00 09 31 00 75 70 70 65 72 2d 72 69 67 68 74 ...1.upper-right +| 4016: 20 63 6f 72 6e 65 72 17 03 05 00 09 31 00 6c 6f corner.....1.lo +| 4032: 77 65 72 2d 72 69 67 68 74 20 63 6f 72 6e 65 72 wer-right corner +| 4048: 16 02 05 00 09 2f 00 75 70 70 65 72 2d 6c 65 66 ...../.upper-lef +| 4064: 74 20 63 6f 72 6e 65 72 16 01 05 00 09 2f 00 6c t corner...../.l +| 4080: 6f 77 65 72 2d 6c 65 66 74 20 63 6f 72 6e 65 72 ower-left corner +| page 3 offset 8192 +| 0: 0d 00 00 00 01 0b 2d 00 0b 2d 00 00 00 00 00 00 ......-..-...... +| 2848: 00 00 00 00 00 00 00 00 00 00 00 00 00 89 50 01 ..............P. +| 2864: 04 00 93 24 00 00 00 0e 00 00 00 00 00 00 00 01 ...$............ +| 2880: 00 00 00 04 01 20 00 00 00 00 00 04 12 00 00 00 ..... .......... +| 2896: 00 00 00 00 00 00 00 23 00 00 00 00 41 20 00 00 .......#....A .. +| 2912: 42 b4 00 00 42 c8 00 00 00 00 00 00 00 00 00 03 B...B........... +| 2928: 42 b4 00 00 42 c8 00 00 00 00 00 00 41 20 00 00 B...B.......A .. +| 2944: 00 00 00 00 00 00 00 04 42 b4 00 00 42 c8 00 00 ........B...B... +| 2960: 42 b4 00 00 42 c8 00 00 00 00 00 00 00 00 00 05 B...B........... +| 2976: 42 20 00 00 42 70 00 00 42 20 00 00 42 70 00 00 B ..Bp..B ..Bp.. +| 2992: 00 00 00 00 00 00 00 06 00 00 00 00 40 a0 00 00 ............@... +| 3008: 00 00 00 04 2c 80 00 00 00 00 00 00 00 00 00 74 ....,..........t +| 3024: 2b e0 00 04 2c 80 00 04 2c 80 00 00 00 00 00 00 +...,...,....... +| 3040: 00 00 00 80 00 00 00 04 2c 80 00 00 00 00 00 04 ........,....... +| 3056: 0a 00 00 00 00 00 b0 80 00 00 04 2c 80 00 04 2b ...........,...+ +| 3072: e0 00 04 2c 80 00 00 00 00 00 00 00 00 00 a0 00 ...,............ +| 3088: 00 00 04 2c 80 00 00 00 00 00 04 2c 80 00 00 00 ...,.......,.... +| 3104: 00 00 00 00 00 00 b0 00 00 00 04 24 80 00 00 00 ...........$.... +| 3120: 00 00 04 2c 80 00 00 00 00 00 00 00 50 00 91 f0 ...,........P... +| 3136: 06 c6 56 67 42 06 86 16 c6 61 40 a0 50 00 92 b0 ..VgB....a@.P... +| 3152: 07 46 86 52 07 76 86 f6 c6 52 07 46 86 96 e6 70 .F.R.v...R.F...p +| 3168: d0 90 50 00 91 d0 07 46 f7 02 06 56 46 76 51 00 ..P....F...VFvQ. +| 3184: 80 50 00 92 30 06 26 f7 47 46 f6 d2 06 56 46 76 .P..0.&.GF...VFv +| 3200: 50 f0 70 50 00 92 10 07 26 96 76 87 42 06 56 46 P.pP....&.v.B.VF +| 3216: 76 50 e0 60 50 00 91 f0 06 c6 56 67 42 06 56 46 vP.`P.....VgB.VF +| 3232: 76 50 b0 50 50 00 91 90 06 36 56 e7 46 57 21 70 vP.PP....6V.FW!p +| 3248: 40 50 00 93 10 07 57 07 06 57 22 d7 26 96 76 87 @P....W..W..&.v. +| 3264: 42 06 36 f7 26 e6 57 21 70 30 50 00 93 10 06 c6 B.6.&.W!p0P..... +| 3280: f7 76 57 22 d7 26 96 76 87 42 06 36 f7 26 e6 57 .vW..&.v.B.6.&.W +| 3296: 21 60 20 50 00 92 f0 07 57 07 06 57 22 d6 c6 56 !` P....W..W...V +| 3312: 60 00 00 c4 24 c0 00 04 2c 80 00 00 00 00 00 04 `...$...,....... +| 3328: 2c 80 00 00 00 00 00 00 00 00 00 d0 00 00 00 04 ,............... +| 3344: 2c 80 00 00 00 00 00 04 24 80 00 00 00 00 00 00 ,.......$....... +| 3360: 00 00 00 e0 00 00 00 04 2c 80 00 04 24 c0 00 04 ........,...$... +| 3376: 2c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,............... +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| end c4.db + }] + catchsql { + UPDATE t1 SET label='x'; + } +} {1 {rtree constraint failed: t1.(y0<=y1)}} +do_test rtreefuzz001-310 { + catchsql { + SELECT rtreecheck('t1'); + } +} {/1 .*corrupt.*/} + +do_test rtreefuzz001-400 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 16384 pagesize 4096 filename c7.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 04 .....@ ........ +| 32: 00 00 00 00 01 00 00 00 00 00 00 04 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 04 0e 9c 00 0f ad 0f 4f ...............O +| 112: 0e fc 0e 9c 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3728: 00 00 00 00 00 00 00 00 00 00 00 00 5e 04 07 17 ............^... +| 3744: 1f 1f 01 81 0b 74 61 62 6c 65 74 31 5f 70 61 72 .....tablet1_par +| 3760: 65 6e 74 74 31 5f 70 61 72 65 6e 74 04 43 52 45 entt1_parent.CRE +| 3776: 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 70 61 ATE TABLE .t1_pa +| 3792: 72 65 6e 74 22 28 6e 6f 64 65 6e 6f 20 49 4e 54 rent.(nodeno INT +| 3808: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 EGER PRIMARY KEY +| 3824: 2c 70 61 72 65 6e 74 6e 6f 64 65 29 51 03 06 17 ,parentnode)Q... +| 3840: 1b 1b 01 7b 74 61 62 6c 65 74 31 5f 6e 6f 64 65 ....tablet1_node +| 3856: 74 31 5f 6e 6f 64 65 03 43 52 45 41 54 45 20 54 t1_node.CREATE T +| 3872: 41 42 4c 45 20 22 74 31 5f 6e 6f 64 65 22 28 6e ABLE .t1_node.(n +| 3888: 6f 64 65 6e 6f 20 49 4e 54 45 47 45 52 20 50 52 odeno INTEGER PR +| 3904: 49 4d 41 52 59 20 4b 45 59 2c 64 61 74 61 29 5c IMARY KEY,data). +| 3920: 02 07 17 1d 1d 01 81 0b 74 61 62 6c 65 74 31 5f ........tablet1_ +| 3936: 72 6f 77 69 64 74 31 5f 72 6f 77 69 64 02 43 52 rowidt1_rowid.CR +| 3952: 45 41 54 45 20 54 41 42 4c 45 20 22 74 31 5f 72 EATE TABLE .t1_r +| 3968: 6f 77 69 64 22 28 72 6f 77 69 64 20 49 4e 54 45 owid.(rowid INTE +| 3984: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY, +| 4000: 6e 6f 64 65 6e 6f 2c 61 30 2c 61 31 29 51 01 07 nodeno,a0,a1)Q.. +| 4016: 17 11 11 08 81 0f 74 61 62 6c 65 74 31 74 31 43 ......tablet1t1C +| 4032: 52 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 REATE VIRTUAL TA +| 4048: 42 4c 45 20 74 31 20 55 53 49 4e 47 20 72 74 72 BLE t1 USING rtr +| 4064: 65 65 28 69 64 2c 78 30 2c 78 31 2c 79 30 2c 79 ee(id,x0,x1,y0,y +| 4080: 31 2c 2b 6c 61 62 65 6c 2c 2b 6f 74 68 65 72 29 1,+label,+other) +| page 2 offset 4096 +| 0: 0d 00 00 00 0e 0e f7 00 0f e8 0f d0 0f b7 0f 9e ................ +| 16: 0f 91 0f 81 0f 70 0f 5e 0f 4f 0f 39 0f 29 0f 18 .....p.^.O.9.).. +| 32: 0f 06 0e f7 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3824: 00 00 00 00 00 00 00 0d 0e 05 00 09 1d 00 74 6f ..............to +| 3840: 70 20 68 61 6c 66 10 0d 05 00 09 23 00 62 6f 74 p half.....#.bot +| 3856: 74 6f 6d 20 68 61 6c 66 0f 0c 05 00 09 21 00 72 tom half.....!.r +| 3872: 69 67 68 74 20 68 61 6c 66 0e 0b 05 00 09 1f 00 ight half....... +| 3888: 6c 65 66 74 20 68 61 6c 66 14 0a 05 00 09 2b 00 left half.....+. +| 3904: 74 68 65 20 77 68 6f 6c 65 20 74 68 69 6e 67 0d the whole thing. +| 3920: 09 05 00 09 1d 00 74 6f 70 20 65 64 67 65 10 08 ......top edge.. +| 3936: 05 00 09 23 00 62 6f 74 74 6f 6d 20 65 64 67 65 ...#.bottom edge +| 3952: 0f 07 05 00 09 21 00 72 69 67 68 74 20 65 64 67 .....!.right edg +| 3968: 65 0e 06 05 00 09 1f 00 6c 65 66 74 20 65 64 67 e.......left edg +| 3984: 65 0b 05 05 00 09 19 00 23 65 6e 74 65 72 17 04 e.......#enter.. +| 4000: 05 00 09 31 00 75 70 70 65 72 2d 72 69 67 68 74 ...1.upper-right +| 4016: 20 63 6f 72 6e 65 72 17 03 05 00 09 31 00 6c 6f corner.....1.lo +| 4032: 77 65 72 2d 72 69 67 68 74 20 63 6f 72 6e 65 72 wer-right corner +| 4048: 16 02 05 00 09 2f 00 75 70 70 65 72 2d 6c 65 66 ...../.upper-lef +| 4064: 74 20 63 6f 72 6e 65 72 16 01 05 00 09 2f 00 6c t corner...../.l +| 4080: 6f 77 65 72 2d 6c 65 66 74 20 63 6f 72 6e 65 72 ower-left corner +| page 3 offset 8192 +| 0: 0d 00 00 00 02 0b 2d 00 0b 2d 00 00 00 00 00 00 ......-..-...... +| 2848: 00 00 00 00 00 00 00 00 00 00 00 00 00 89 50 01 ..............P. +| 2864: 04 00 93 24 00 00 00 00 00 00 00 00 08 00 00 00 ...$............ +| 2880: 00 42 c8 00 00 00 00 00 00 40 a0 00 00 00 00 00 .B.......@...... +| 2896: 00 00 00 00 42 c8 00 00 00 00 00 00 00 00 00 07 ....B........... +| 2912: 42 be 00 00 42 c8 00 00 00 00 00 00 42 c8 00 00 B...B.......B... +| 2928: 00 00 00 00 00 00 00 08 00 00 00 00 42 c8 00 00 ............B... +| 2944: 00 00 00 00 40 a0 00 00 00 00 00 00 00 00 00 09 ....@........... +| 2960: 00 00 00 00 42 c8 00 00 42 be 00 00 42 c8 00 00 ....B...B...B... +| 2976: 00 00 00 00 00 00 00 0a 00 00 00 00 42 c8 00 00 ............B... +| 2992: 00 00 00 00 42 c8 00 00 00 00 00 00 00 00 00 0b ....B........... +| 3008: 00 00 00 00 42 48 00 00 00 00 00 04 2c 80 00 00 ....BH......,... +| 3024: 00 00 00 00 00 00 00 c4 00 00 00 00 00 42 c8 00 .............B.. +| 3040: 00 00 00 00 00 00 00 00 07 42 be 00 00 42 c8 00 .........B...B.. +| 3056: 00 00 00 00 00 42 c8 00 00 00 00 00 00 00 00 00 .....B.......... +| 3072: 08 00 00 00 00 42 c8 00 00 00 00 00 00 40 a0 00 .....B.......@.. +| 3088: 00 00 00 00 00 00 00 00 09 00 00 00 00 42 c8 00 .............B.. +| 3104: 00 42 be 00 00 42 c8 00 00 00 00 00 00 00 00 00 .B...B.......... +| 3120: 0a 00 00 00 00 42 c8 00 00 00 00 00 00 42 c8 00 .....B.......B.. +| 3136: 00 00 00 00 00 00 00 00 0b 00 00 00 00 42 48 00 .............BH. +| 3152: 00 00 00 00 04 2c 80 00 00 00 00 00 00 00 00 00 .....,.......... +| 3168: c4 24 c0 00 04 2c 80 00 00 00 00 00 04 2c 80 00 .$...,.......,.. +| 3184: 00 00 00 00 00 00 00 00 d0 00 00 00 04 2c 80 00 .............,.. +| 3200: 00 00 00 00 04 24 80 00 00 00 00 00 00 00 00 00 .....$.......... +| 3216: e0 00 00 00 04 2c 80 00 04 24 c0 00 04 2c 00 00 .....,...$...,.. +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 0e 00 00 00 ................ +| 16: 00 42 c8 00 00 42 4c 00 00 42 c8 00 00 00 00 00 .B...BL..B...... +| 32: 00 00 00 0a 00 00 00 00 42 c8 00 00 00 00 00 00 ........B....... +| 48: 42 c8 00 00 00 00 00 00 00 00 00 0b 00 00 00 00 B............... +| 64: 42 48 00 00 00 00 00 04 2c 80 00 00 00 00 00 00 BH......,....... +| 80: 00 00 00 c4 24 c0 00 04 2c 80 00 00 00 00 00 04 ....$...,....... +| 96: 2c 80 00 00 00 00 00 00 00 00 00 d0 00 00 00 04 ,............... +| 112: 2c 80 00 00 00 00 00 04 24 80 00 00 00 00 00 00 ,.......$....... +| 128: 00 00 00 e0 00 00 00 04 2c 80 00 04 24 c0 00 04 ........,...$... +| 144: 2c 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ,............... +| end c7.db + }] + catchsql { + WITH RECURSIVE + c1(x) AS (VALUES(0) UNION ALL SELECT x+1 FROM c1 WHERE x<8), + c2(y) AS (VALUES(0) UNION ALL SELECT y+1 FROM c2 WHERE y<5) + INSERT INTO t1(id, x0,x1,y0,y1,label) + SELECT 1000+x+y*100, x, x+1, y, y+1, printf('box-%d,%d',x,y) FROM c1, c2; + } +} {1 {database disk image is malformed}} + +finish_test diff --git a/ext/session/changeset.c b/ext/session/changeset.c index edb43ff..72f2da4 100644 --- a/ext/session/changeset.c +++ b/ext/session/changeset.c @@ -42,7 +42,7 @@ static void usage(const char *argv0){ */ static void readFile(const char *zFilename, int *pSz, void **ppBuf){ FILE *f; - int sz; + sqlite3_int64 sz; void *pBuf; f = fopen(zFilename, "rb"); if( f==0 ){ @@ -50,9 +50,9 @@ static void readFile(const char *zFilename, int *pSz, void **ppBuf){ exit(1); } fseek(f, 0, SEEK_END); - sz = (int)ftell(f); + sz = ftell(f); rewind(f); - pBuf = sqlite3_malloc( sz ? sz : 1 ); + pBuf = sqlite3_malloc64( sz ? sz : 1 ); if( pBuf==0 ){ fprintf(stderr, "cannot allocate %d to hold content of \"%s\"\n", sz, zFilename); diff --git a/ext/session/changesetfuzz.c b/ext/session/changesetfuzz.c index fd88733..8cbca80 100644 --- a/ext/session/changesetfuzz.c +++ b/ext/session/changesetfuzz.c @@ -141,7 +141,7 @@ static void usage(const char *argv0){ */ static void fuzzReadFile(const char *zFilename, int *pSz, void **ppBuf){ FILE *f; - int sz; + sqlite3_int64 sz; void *pBuf; f = fopen(zFilename, "rb"); if( f==0 ){ @@ -149,9 +149,9 @@ static void fuzzReadFile(const char *zFilename, int *pSz, void **ppBuf){ exit(1); } fseek(f, 0, SEEK_END); - sz = (int)ftell(f); + sz = ftell(f); rewind(f); - pBuf = sqlite3_malloc( sz ? sz : 1 ); + pBuf = sqlite3_malloc64( sz ? sz : 1 ); if( pBuf==0 ){ fprintf(stderr, "cannot allocate %d to hold content of \"%s\"\n", sz, zFilename); @@ -340,8 +340,8 @@ struct FuzzChange { /* ** Allocate and return nByte bytes of zeroed memory. */ -static void *fuzzMalloc(int nByte){ - void *pRet = sqlite3_malloc(nByte); +static void *fuzzMalloc(sqlite3_int64 nByte){ + void *pRet = sqlite3_malloc64(nByte); if( pRet ){ memset(pRet, 0, nByte); } @@ -631,7 +631,7 @@ static int fuzzParseChangeset( /* If the table-header was successfully parsed, add the new change-group ** to the array and parse the associated changes. */ if( rc==SQLITE_OK ){ - FuzzChangesetGroup **apNew = (FuzzChangesetGroup**)sqlite3_realloc( + FuzzChangesetGroup **apNew = (FuzzChangesetGroup**)sqlite3_realloc64( pParse->apGroup, sizeof(FuzzChangesetGroup*)*(pParse->nGroup+1) ); if( apNew==0 ){ @@ -1214,7 +1214,7 @@ int main(int argc, char **argv){ fuzzPrintGroup(&changeset, changeset.apGroup[i]); } }else{ - pBuf = (u8*)fuzzMalloc(nChangeset*2 + 1024); + pBuf = (u8*)fuzzMalloc((sqlite3_int64)nChangeset*2 + 1024); if( pBuf==0 ){ rc = SQLITE_NOMEM; }else{ @@ -1237,4 +1237,3 @@ int main(int argc, char **argv){ return rc; } - diff --git a/ext/session/session_speed_test.c b/ext/session/session_speed_test.c index 14b97ea..405001c 100644 --- a/ext/session/session_speed_test.c +++ b/ext/session/session_speed_test.c @@ -356,5 +356,3 @@ int main(int argc, char **argv){ return 0; } - - diff --git a/ext/session/sessionwor.test b/ext/session/sessionwor.test index 2b2f8ca..0f0b429 100644 --- a/ext/session/sessionwor.test +++ b/ext/session/sessionwor.test @@ -30,27 +30,71 @@ proc test_reset {} { sqlite3 db2 test.db2 } +foreach {tn wo} { + 1 "" + 2 "WITHOUT ROWID" +} { + reset_db -do_execsql_test 1.0 { - CREATE TABLE t1(a PRIMARY KEY, b) WITHOUT ROWID; + do_execsql_test 1.$tn.0 "CREATE TABLE t1(a PRIMARY KEY, b) $wo ;" + + do_iterator_test 1.$tn.1 t1 { + INSERT INTO t1 VALUES('one', 'two'); + } { + {INSERT t1 0 X. {} {t one t two}} + } + + do_iterator_test 1.$tn.2 t1 { + UPDATE t1 SET b='three' + } { + {UPDATE t1 0 X. {t one t two} {{} {} t three}} + } + + do_iterator_test 1.$tn.3 t1 { + REPLACE INTO t1 VALUES('one', 'four'); + } { + {UPDATE t1 0 X. {t one t three} {{} {} t four}} + } + + do_iterator_test 1.$tn.4 t1 { + DELETE FROM t1; + } { + {DELETE t1 0 X. {t one t four} {}} + } } -do_iterator_test 1.1 t1 { - INSERT INTO t1 VALUES('one', 'two'); +foreach {tn wo} { + 1 "" + 2 "WITHOUT ROWID" } { - {INSERT t1 0 X. {} {t one t two}} -} + reset_db -do_iterator_test 1.2 t1 { - UPDATE t1 SET b='three' -} { - {UPDATE t1 0 X. {t one t two} {{} {} t three}} -} - -do_iterator_test 1.3 t1 { - DELETE FROM t1; -} { - {DELETE t1 0 X. {t one t three} {}} + do_execsql_test 2.$tn.0 "CREATE TABLE t1(a INTEGER PRIMARY KEY, b) $wo ;" + + do_iterator_test 1.1 t1 { + INSERT INTO t1 VALUES(1, 'two'); + } { + {INSERT t1 0 X. {} {i 1 t two}} + } + + do_iterator_test 2.$tn.2 t1 { + UPDATE t1 SET b='three' + } { + {UPDATE t1 0 X. {i 1 t two} {{} {} t three}} + } + + do_iterator_test 2.$tn.3 t1 { + REPLACE INTO t1 VALUES(1, 'four'); + } { + {UPDATE t1 0 X. {i 1 t three} {{} {} t four}} + } + + do_iterator_test 2.$tn.4 t1 { + DELETE FROM t1; + } { + {DELETE t1 0 X. {i 1 t four} {}} + } } finish_test + diff --git a/ext/session/sqlite3session.c b/ext/session/sqlite3session.c index df4323f..6f722ba 100644 --- a/ext/session/sqlite3session.c +++ b/ext/session/sqlite3session.c @@ -363,7 +363,7 @@ static void sessionPutI64(u8 *aBuf, sqlite3_int64 i){ static int sessionSerializeValue( u8 *aBuf, /* If non-NULL, write serialized value here */ sqlite3_value *pValue, /* Value to serialize */ - int *pnWrite /* IN/OUT: Increment by bytes written */ + sqlite3_int64 *pnWrite /* IN/OUT: Increment by bytes written */ ){ int nByte; /* Size of serialized value in bytes */ @@ -904,7 +904,7 @@ static int sessionGrowHash(int bPatchset, SessionTable *pTab){ SessionChange **apNew; int nNew = (pTab->nChange ? pTab->nChange : 128) * 2; - apNew = (SessionChange **)sqlite3_malloc(sizeof(SessionChange *) * nNew); + apNew = (SessionChange **)sqlite3_malloc64(sizeof(SessionChange *) * nNew); if( apNew==0 ){ if( pTab->nChange==0 ){ return SQLITE_ERROR; @@ -970,7 +970,7 @@ static int sessionTableInfo( char *zPragma; sqlite3_stmt *pStmt; int rc; - int nByte; + sqlite3_int64 nByte; int nDbCol = 0; int nThis; int i; @@ -1013,7 +1013,7 @@ static int sessionTableInfo( if( rc==SQLITE_OK ){ nByte += nDbCol * (sizeof(const char *) + sizeof(u8) + 1); - pAlloc = sqlite3_malloc(nByte); + pAlloc = sqlite3_malloc64(nByte); if( pAlloc==0 ){ rc = SQLITE_NOMEM; } @@ -1154,7 +1154,7 @@ static void sessionPreupdateOneChange( int iHash; int bNull = 0; int rc = SQLITE_OK; - SessionStat1Ctx stat1 = {0}; + SessionStat1Ctx stat1 = {{0,0,0,0,0},0}; if( pSession->rc ) return; @@ -1211,7 +1211,7 @@ static void sessionPreupdateOneChange( ** this is an SQLITE_UPDATE or SQLITE_DELETE), or just the PK ** values (if this is an INSERT). */ SessionChange *pChange; /* New change object */ - int nByte; /* Number of bytes to allocate */ + sqlite3_int64 nByte; /* Number of bytes to allocate */ int i; /* Used to iterate through columns */ assert( rc==SQLITE_OK ); @@ -1236,7 +1236,7 @@ static void sessionPreupdateOneChange( } /* Allocate the change object */ - pChange = (SessionChange *)sqlite3_malloc(nByte); + pChange = (SessionChange *)sqlite3_malloc64(nByte); if( !pChange ){ rc = SQLITE_NOMEM; goto error_out; @@ -1680,7 +1680,7 @@ int sqlite3session_create( *ppSession = 0; /* Allocate and populate the new session object. */ - pNew = (sqlite3_session *)sqlite3_malloc(sizeof(sqlite3_session) + nDb + 1); + pNew = (sqlite3_session *)sqlite3_malloc64(sizeof(sqlite3_session) + nDb + 1); if( !pNew ) return SQLITE_NOMEM; memset(pNew, 0, sizeof(sqlite3_session)); pNew->db = db; @@ -1799,7 +1799,7 @@ int sqlite3session_attach( if( !pTab ){ /* Allocate new SessionTable object. */ - pTab = (SessionTable *)sqlite3_malloc(sizeof(SessionTable) + nName + 1); + pTab = (SessionTable *)sqlite3_malloc64(sizeof(SessionTable) + nName + 1); if( !pTab ){ rc = SQLITE_NOMEM; }else{ @@ -1859,7 +1859,7 @@ static int sessionBufferGrow(SessionBuffer *p, int nByte, int *pRc){ static void sessionAppendValue(SessionBuffer *p, sqlite3_value *pVal, int *pRc){ int rc = *pRc; if( rc==SQLITE_OK ){ - int nByte = 0; + sqlite3_int64 nByte = 0; rc = sessionSerializeValue(0, pVal, &nByte); sessionBufferGrow(p, nByte, &rc); if( rc==SQLITE_OK ){ @@ -2735,7 +2735,7 @@ static int sessionValueSetStr( ** argument to sqlite3ValueSetStr() and have the copy created ** automatically. But doing so makes it difficult to detect any OOM ** error. Hence the code to create the copy externally. */ - u8 *aCopy = sqlite3_malloc(nData+1); + u8 *aCopy = sqlite3_malloc64((sqlite3_int64)nData+1); if( aCopy==0 ) return SQLITE_NOMEM; memcpy(aCopy, aData, nData); sqlite3ValueSetStr(pVal, nData, (char*)aCopy, enc, sqlite3_free); @@ -3348,7 +3348,7 @@ static int sessionChangesetInvert( int iCol; if( 0==apVal ){ - apVal = (sqlite3_value **)sqlite3_malloc(sizeof(apVal[0])*nCol*2); + apVal = (sqlite3_value **)sqlite3_malloc64(sizeof(apVal[0])*nCol*2); if( 0==apVal ){ rc = SQLITE_NOMEM; goto finished_invert; @@ -4621,7 +4621,7 @@ static int sessionChangeMerge( int rc = SQLITE_OK; if( !pExist ){ - pNew = (SessionChange *)sqlite3_malloc(sizeof(SessionChange) + nRec); + pNew = (SessionChange *)sqlite3_malloc64(sizeof(SessionChange) + nRec); if( !pNew ){ return SQLITE_NOMEM; } @@ -4654,8 +4654,8 @@ static int sessionChangeMerge( if( pExist->op==SQLITE_DELETE && pExist->bIndirect ){ *ppNew = pExist; }else{ - int nByte = nRec + pExist->nRecord + sizeof(SessionChange); - pNew = (SessionChange*)sqlite3_malloc(nByte); + sqlite3_int64 nByte = nRec + pExist->nRecord + sizeof(SessionChange); + pNew = (SessionChange*)sqlite3_malloc64(nByte); if( pNew==0 ){ rc = SQLITE_NOMEM; }else{ @@ -4715,14 +4715,14 @@ static int sessionChangeMerge( assert( pNew==0 ); }else{ u8 *aExist = pExist->aRecord; - int nByte; + sqlite3_int64 nByte; u8 *aCsr; /* Allocate a new SessionChange object. Ensure that the aRecord[] ** buffer of the new object is large enough to hold any record that ** may be generated by combining the input records. */ nByte = sizeof(SessionChange) + pExist->nRecord + nRec; - pNew = (SessionChange *)sqlite3_malloc(nByte); + pNew = (SessionChange *)sqlite3_malloc64(nByte); if( !pNew ){ sqlite3_free(pExist); return SQLITE_NOMEM; @@ -4828,7 +4828,7 @@ static int sessionChangesetToHash( if( !pTab ){ SessionTable **ppTab; - pTab = sqlite3_malloc(sizeof(SessionTable) + nCol + nNew+1); + pTab = sqlite3_malloc64(sizeof(SessionTable) + nCol + nNew+1); if( !pTab ){ rc = SQLITE_NOMEM; break; diff --git a/ext/session/sqlite3session.h b/ext/session/sqlite3session.h index 3d1df42..e9c2989 100644 --- a/ext/session/sqlite3session.h +++ b/ext/session/sqlite3session.h @@ -548,7 +548,7 @@ int sqlite3changeset_next(sqlite3_changeset_iter *pIter); ** sqlite3changeset_next() is called on the iterator or until the ** conflict-handler function returns. If pnCol is not NULL, then *pnCol is ** set to the number of columns in the table affected by the change. If -** pbIncorrect is not NULL, then *pbIndirect is set to true (1) if the change +** pbIndirect is not NULL, then *pbIndirect is set to true (1) if the change ** is an indirect change, or false (0) otherwise. See the documentation for ** [sqlite3session_indirect()] for a description of direct and indirect ** changes. Finally, if pOp is not NULL, then *pOp is set to one of diff --git a/main.mk b/main.mk index d18313b..c4e8b78 100644 --- a/main.mk +++ b/main.mk @@ -369,6 +369,7 @@ TESTSRC += \ $(TOP)/ext/misc/nextchar.c \ $(TOP)/ext/misc/normalize.c \ $(TOP)/ext/misc/percentile.c \ + $(TOP)/ext/misc/prefixes.c \ $(TOP)/ext/misc/regexp.c \ $(TOP)/ext/misc/remember.c \ $(TOP)/ext/misc/series.c \ @@ -509,7 +510,8 @@ FUZZDATA = \ $(TOP)/test/fuzzdata4.db \ $(TOP)/test/fuzzdata5.db \ $(TOP)/test/fuzzdata6.db \ - $(TOP)/test/fuzzdata7.db + $(TOP)/test/fuzzdata7.db \ + $(TOP)/test/fuzzdata8.db # Standard options to testfixture # @@ -530,6 +532,11 @@ FUZZERSHELL_OPT = -DSQLITE_ENABLE_JSON1 FUZZCHECK_OPT = -DSQLITE_ENABLE_JSON1 -DSQLITE_ENABLE_MEMSYS5 FUZZCHECK_OPT += -DSQLITE_MAX_MEMORY=50000000 FUZZCHECK_OPT += -DSQLITE_PRINTF_PRECISION_LIMIT=1000 +FUZZCHECK_OPT += -DSQLITE_ENABLE_DESERIALIZE +FUZZCHECK_OPT += -DSQLITE_ENABLE_FTS4 +FUZZCHECK_OPT += -DSQLITE_ENABLE_RTREE +FUZZCHECK_OPT += -DSQLITE_ENABLE_GEOPOLY +FUZZCHECK_OPT += -DSQLITE_ENABLE_DBSTAT_VTAB DBFUZZ_OPT = KV_OPT = -DSQLITE_THREADSAFE=0 -DSQLITE_DIRECT_OVERFLOW_READ ST_OPT = -DSQLITE_THREADSAFE=0 @@ -574,6 +581,20 @@ dbfuzz$(EXE): $(TOP)/test/dbfuzz.c sqlite3.c sqlite3.h $(DBFUZZ_OPT) $(TOP)/test/dbfuzz.c sqlite3.c \ $(TLIBS) $(THREADLIB) +DBFUZZ2_OPTS = \ + -DSQLITE_THREADSAFE=0 \ + -DSQLITE_OMIT_LOAD_EXTENSION \ + -DSQLITE_ENABLE_DESERIALIZE \ + -DSQLITE_DEBUG \ + -DSQLITE_ENABLE_DBSTAT_VTAB \ + -DSQLITE_ENABLE_RTREE \ + -DSQLITE_ENABLE_FTS4 \ + -DSQLITE_ENABLE_FTS5 + +dbfuzz2$(EXE): $(TOP)/test/dbfuzz2.c sqlite3.c sqlite3.h + $(TCCX) -I. -g -O0 -DSTANDALONE -o dbfuzz2$(EXE) \ + $(DBFUZZ2_OPTS) $(TOP)/test/dbfuzz2.c sqlite3.c $(TLIBS) $(THREADLIB) + fuzzcheck$(EXE): $(TOP)/test/fuzzcheck.c sqlite3.c sqlite3.h $(TOP)/test/ossfuzz.c $(TCCX) -o fuzzcheck$(EXE) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION \ -DSQLITE_ENABLE_MEMSYS5 $(FUZZCHECK_OPT) -DSQLITE_OSS_FUZZ \ @@ -719,6 +740,7 @@ SHELL_SRC = \ $(TOP)/ext/expert/sqlite3expert.c \ $(TOP)/ext/expert/sqlite3expert.h \ $(TOP)/ext/misc/zipfile.c \ + $(TOP)/ext/misc/memtrace.c \ $(TOP)/src/test_windirent.c shell.c: $(SHELL_SRC) $(TOP)/tool/mkshellc.tcl @@ -976,6 +998,9 @@ $(TEST_EXTENSION): $(TOP)/src/test_loadext.c extensiontest: testfixture$(EXE) $(TEST_EXTENSION) ./testfixture$(EXE) $(TOP)/test/loadext.test +dbtotxt$(EXE): $(TOP)/tool/dbtotxt.c + $(TCC) -o dbtotxt$(EXE) $(TOP)/tool/dbtotxt.c + showdb$(EXE): $(TOP)/tool/showdb.c sqlite3.o $(TCC) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -o showdb$(EXE) \ $(TOP)/tool/showdb.c sqlite3.o $(THREADLIB) @@ -995,6 +1020,10 @@ showwal$(EXE): $(TOP)/tool/showwal.c sqlite3.o showshm$(EXE): $(TOP)/tool/showshm.c $(TCC) -o showshm$(EXE) $(TOP)/tool/showshm.c +index_usage$(EXE): $(TOP)/tool/index_usage.c sqlite3.o + $(TCC) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_DEPRECATED $(SHELL_OPTS) -o index_usage$(EXE) \ + $(TOP)/tool/index_usage.c sqlite3.o $(THREADLIB) + changeset$(EXE): $(TOP)/ext/session/changeset.c sqlite3.o $(TCC) -DSQLITE_THREADSAFE=0 -DSQLITE_OMIT_LOAD_EXTENSION -o changeset$(EXE) \ $(TOP)/ext/session/changeset.c sqlite3.o $(THREADLIB) diff --git a/manifest b/manifest index bb8f372..65f29c9 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,12 @@ -C Version\s3.26.0 -D 2018-12-01T12:34:55.966 +C Version\s3.27.1 +D 2019-02-08T13:17:39.690 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea -F Makefile.in a050c8670ea0d7b37b2192306cbb50d392acd9902b84e9b56f3444d006f97a6c +F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 -F Makefile.msc 0d6831ff7951b302e888d86d4c469e2ec3c22f59eba4118b8c38d5a51d9e2d4f +F Makefile.msc 5df60c70edb157feb2148a14c687551969599bd065875a0b959b6b139721ca72 F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee -F VERSION 654da1d4053fb09ffc33a3910e6d427182a7dcdc67e934fa83de2849ac83fccb +F VERSION 15b2d421b2265aad451c0493066c1c31a511a72c5153bb4e9d5f62adbc12134c F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 @@ -14,7 +14,7 @@ F art/sqlite370.jpg d512473dae7e378a67e28ff96a34da7cb331def2 F autoconf/INSTALL 83e4a25da9fd053c7b3665eaaaf7919707915903 F autoconf/Makefile.am e14b629addaa1ce372b72043f28f40de2e32b7e211b6e0fc18dbb87989197e40 F autoconf/Makefile.fallback 22fe523eb36dfce31e0f6349f782eb084e86a5620b2b0b4f84a2d6133f53f5ac -F autoconf/Makefile.msc 9e73d9abaadb7a4951ddd0e947c5c791770f23bb1e04bfa50b43c01bee0575f2 +F autoconf/Makefile.msc ee8ab2b6b5d712f68acc4c186e3fad7b831b87a2b118e0a123043ea8a2c8b016 F autoconf/README.first 6c4f34fe115ff55d4e8dbfa3cecf04a0188292f7 F autoconf/README.txt 4f04b0819303aabaa35fff5f7b257fb0c1ef95f1 F autoconf/configure.ac 308de24343e76ecfbe9a67f8fcd4c5216b790d230c5d9ce10210b7d5965d6192 @@ -33,7 +33,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 -F configure 5811ffcd4866902d1706dcf8e0527f89165ec52859659942c9649bb1d3e4cc7b x +F configure 2b0310f5ddb82f4e2c524c0bc7bacf480b0ac21bf05b543d7e72e2682772eaac x F configure.ac 3552d3aecade98a9d4b64bceb48ffb7726cbc85902efde956812942f060fbd0a F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd @@ -46,7 +46,7 @@ F ext/async/sqlite3async.c 0f3070cc3f5ede78f2b9361fb3b629ce200d7d74 F ext/async/sqlite3async.h f489b080af7e72aec0e1ee6f1d98ab6cf2e4dcef F ext/expert/README.md b321c2762bb93c18ea102d5a5f7753a4b8bac646cb392b3b437f633caf2020c3 F ext/expert/expert.c d548d603a4cc9e61f446cc179c120c6713511c413f82a4a32b1e1e69d3f086a4 -F ext/expert/expert1.test 333d037021c901322f9afc4a5687648ea23d56f1a0a079358a390664babf01be +F ext/expert/expert1.test 358e416877a5693fb99d5514f5d88452b5239dc2196b74e0e926718502faef6d F ext/expert/sqlite3expert.c 3da865f2286433588260f41e796422c611bceaca3a0bbf9139a619cf7d062c19 F ext/expert/sqlite3expert.h af6354f8ee5c9e025024e63fec3bd640a802afcc3099a44d804752cf0791d811 F ext/expert/test_expert.c d56c194b769bdc90cf829a14c9ecbc1edca9c850b837a4d0b13be14095c32a72 @@ -80,55 +80,55 @@ F ext/fts3/README.content fdc666a70d5257a64fee209f97cf89e0e6e32b51 F ext/fts3/README.syntax a19711dc5458c20734b8e485e75fb1981ec2427a F ext/fts3/README.tokenizers e0a8b81383ea60d0334d274fadf305ea14a8c314 F ext/fts3/README.txt 8c18f41574404623b76917b9da66fcb0ab38328d -F ext/fts3/fts3.c 65b8489e35da23b127992c6dd6cfd382a486f8c87bf26dfa72876efe46e551bb +F ext/fts3/fts3.c 5da1329ccf66b6d597dfb16b1f81aa204133c1ec96117d82a59c20126f483b17 F ext/fts3/fts3.h 3a10a0af180d502cecc50df77b1b22df142817fe -F ext/fts3/fts3Int.h 3378157f383540857a466420b8279626204434c3eb0dc948ad9bcd3991fc41f5 -F ext/fts3/fts3_aux.c e9b465f8469acc2cd700a90c0242912a3202e4e4e15df72d7db7f1e3a2222c85 -F ext/fts3/fts3_expr.c 3b1dbceddd8622599f3cc2626897667fe40487aaa1676707d6c37ec5a8422fc1 -F ext/fts3/fts3_hash.c 29b986e43f4e9dd40110eafa377dc0d63c422c60 +F ext/fts3/fts3Int.h 74384e28b778a057f1467529715668b98f3f12f52eeb564fd6ae1e894125c00c +F ext/fts3/fts3_aux.c 96708c8b3a7d9b8ca1b68ea2b7e503e283f20e95f145becadedfad096dbd0f34 +F ext/fts3/fts3_expr.c b132af223e90e35b9f9efa9fe63d6ae737d34153a3b6066736086df8abc78a1f +F ext/fts3/fts3_hash.c 8b6e31bfb0844c27dc6092c2620bdb1fca17ed613072db057d96952c6bdb48b7 F ext/fts3/fts3_hash.h 39cf6874dc239d6b4e30479b1975fe5b22a3caaf -F ext/fts3/fts3_icu.c deb46f7020d87ea7a14a433fb7a7f4bef42a9652 +F ext/fts3/fts3_icu.c 305ce7fb6036484085b5556a9c8e62acdc7763f0f4cdf5fd538212a9f3720116 F ext/fts3/fts3_porter.c 3565faf04b626cddf85f03825e86056a4562c009 -F ext/fts3/fts3_snippet.c 68ae118b0f834ea53d2b89e4087fc0f0b8c4ee4e -F ext/fts3/fts3_term.c 9b8065cc70ad514fcc25a7b099ddab8b5333f724dedd57184b7e79238e2b2a39 -F ext/fts3/fts3_test.c 79f2a7fbb3f672fa032e5a432ca274ea3ee93c34 -F ext/fts3/fts3_tokenize_vtab.c a47c2a33de6db00816704315ac0a9afdfa1c71fa5b99f79171c0f7b30861f784 +F ext/fts3/fts3_snippet.c ac1f8945375d07076b7178de1fe549982e6ae6f050095e7f7e400ec4448f31df +F ext/fts3/fts3_term.c 12f7b2318f1254e6cc46dd306e5f2ac5b00b06d6761f5cae09fee5e1817cc32a +F ext/fts3/fts3_test.c b6e9f3fd7155cb388c6bc203fb24817a721fb61d9ce28810c73fcfda8c16fda6 +F ext/fts3/fts3_tokenize_vtab.c 969c132816b6f46ee2c7efafd2547a9bfd50b0aac3f8cef3f2dca2cbd90639c7 F ext/fts3/fts3_tokenizer.c a22bf311a71f3efa9d7012d8cc48fc9b0f3dace7 F ext/fts3/fts3_tokenizer.h 64c6ef6c5272c51ebe60fc607a896e84288fcbc3 F ext/fts3/fts3_tokenizer1.c 5c98225a53705e5ee34824087478cf477bdb7004 -F ext/fts3/fts3_unicode.c 525a3bd9a7564603c5c061b7de55403a565307758a94600e8a2f6b00d1c40d9d -F ext/fts3/fts3_unicode2.c cc04fc672bfd42b1e650398cb0bf71f64f9aae032cfe75bbcfe75b9cf966029c -F ext/fts3/fts3_write.c a85bc4885fde7f1b44c9de013b62f7cd3332dc59e208053d878729b1d04745bc +F ext/fts3/fts3_unicode.c 4b9af6151c29b35ed09574937083cece7c31e911f69615e168a39677569b684d +F ext/fts3/fts3_unicode2.c 416eb7e1e81142703520d284b768ca2751d40e31fa912cae24ba74860532bf0f +F ext/fts3/fts3_write.c 45cbe0b06221f5debefe37f8f9882cf0401592668cb76624a64c0f3f185115de F ext/fts3/fts3speed.tcl b54caf6a18d38174f1a6e84219950d85e98bb1e9 F ext/fts3/mkfts3amal.tcl 252ecb7fe6467854f2aa237bf2c390b74e71f100 F ext/fts3/tool/fts3cov.sh c331d006359456cf6f8f953e37f2b9c7d568f3863f00bb5f7eb87fea4ac01b73 F ext/fts3/tool/fts3view.c 202801a2056995b763864d60c2dee744d46f1677 F ext/fts3/unicode/CaseFolding.txt 8c678ca52ecc95e16bc7afc2dbf6fc9ffa05db8c F ext/fts3/unicode/UnicodeData.txt cd07314edb62d49fde34debdaf92fa2aa69011e7 -F ext/fts3/unicode/mkunicode.tcl 0069320b64db6ee269c5e95f1f150d070fbf0a863fc7b3549d7e52bd068fb118 -F ext/fts3/unicode/parseunicode.tcl 024ae0bdd96309d7b8fc479148191e9b3001dc74017a3f65f9a27de3b3ff968b +F ext/fts3/unicode/mkunicode.tcl 49499f7964504438e2b04cca0627827945bb2499154e2d3ec216b22d20b969ae +F ext/fts3/unicode/parseunicode.tcl a981bd6466d12dd17967515801c3ff23f74a281be1a03cf1e6f52a6959fc77eb F ext/fts5/extract_api_docs.tcl a36e54ec777172ddd3f9a88daf593b00848368e0 -F ext/fts5/fts5.h 5edc74ca603d71284d475886e6e91b5c5cf2e8e93e9ba3a36ba2f2440ee97948 -F ext/fts5/fts5Int.h 39f12034b598df4e0f59bbe6cf03af03a905a534b04f182d155641a04e1eb797 -F ext/fts5/fts5_aux.c ca666a3bbe07c5a3bbe9fffaea19c935a1efaf337333e28bad7bdd1971ffd093 -F ext/fts5/fts5_buffer.c 1dd1ec0446b3acfc2d7d407eb894762a461613e2695273f48e449bfd13e973ff -F ext/fts5/fts5_config.c 5af9c360e99669d29f06492c370892394aba0857 -F ext/fts5/fts5_expr.c 5aef080ba3c8947e22f38ce1ff9fe548e4a740e72b77241f35ed941ae128d2c7 -F ext/fts5/fts5_hash.c 32be400cf761868c9db33efe81a06eb19a17c5402ad477ee9efb51301546dd55 -F ext/fts5/fts5_index.c baf3ad4451d32d35c2bd692ee4a81235ca7f26bd6f7613f7f73505474c33bbf2 -F ext/fts5/fts5_main.c 287a1a56580df304d7fa2fc1890f85b9cb6ac6b9e7c8af7dfa2151528db4b059 -F ext/fts5/fts5_storage.c 4bec8a1b3905978b22a67bca5f4a3cfdb94af234cf51efb36f4f2d733d278634 +F ext/fts5/fts5.h fed314270c1a61de3a0e373b11c2f8228b1c76ce59447dd96d0b6fae7d66399b +F ext/fts5/fts5Int.h 0b002fc71ea705d2c4ec66a63ecd38a2c11127e5b52239b5d71d1dd28309fc19 +F ext/fts5/fts5_aux.c afe8c2394cf6de2a48f278442f4f4342365bf99a5983709ef8e6955c2cf4daf9 +F ext/fts5/fts5_buffer.c 2e750cd4c0d456d4e1a8dcc649382708422b535dc32b375fd3d3306fb9727046 +F ext/fts5/fts5_config.c eeec97cb0237991e7fa3bbae07b5cc354e3f238b661200c11228fe167c18f882 +F ext/fts5/fts5_expr.c 188d1dca5a262a0708efc5deb809f1aa6ecea4158986a439d2670cfe72d10b65 +F ext/fts5/fts5_hash.c d415f5ad332b051f0ade564bcf1762c4467cc49b2ba8ea5873d8744c705d8d42 +F ext/fts5/fts5_index.c ffff7e8d41594256cacf7b32072f8bc06478a86026196a7eb084450065df8d92 +F ext/fts5/fts5_main.c 95d63bbe6075955961e56878c3a8705dc475c2b17f5c767f7b8af14093ae614b +F ext/fts5/fts5_storage.c 57e3f2b1a612961a27c944d6b8821028ec5fdb541d7e6b841785003ac3b0b43a F ext/fts5/fts5_tcl.c 39bcbae507f594aad778172fa914cad0f585bf92fd3b078c686e249282db0d95 -F ext/fts5/fts5_test_mi.c 65864ba1e5c34a61d409c4c587e0bbe0466eb4f8f478d85dc42a92caad1338e6 -F ext/fts5/fts5_test_tok.c 80de1a4b1a3caa216c3be8862440f0117a8357dd9b7cfc5a2a2ce11fe6eb64ae -F ext/fts5/fts5_tokenize.c ebd13d034f3dc7c841e1c32c364a4fca5cc2e05a0b91682a93fa1e6defcd4292 -F ext/fts5/fts5_unicode2.c 543cf0987c27ad59e5a7a6222480b917b5431009b7b139027c9581a63e39e37e -F ext/fts5/fts5_varint.c a5aceacda04dafcbae725413d7a16818ecd65738 -F ext/fts5/fts5_vocab.c fbe38044889b2d2d99babeeef239c620fb0332bb928a84506ac748d81500b354 +F ext/fts5/fts5_test_mi.c 08c11ec968148d4cb4119d96d819f8c1f329812c568bac3684f5464be177d3ee +F ext/fts5/fts5_test_tok.c f96c6e193c466711d6d7828d5f190407fe7ab897062d371426dd3036f01258e7 +F ext/fts5/fts5_tokenize.c 4d904c237707de8fbb8ab98d24d5c55d47204a3f1f35895d8a53a5327079b32c +F ext/fts5/fts5_unicode2.c d8a1528c9a19f79b843c486e5e64bff17d667791ae7f658e11131ebac4b33c59 +F ext/fts5/fts5_varint.c e64d2113f6e1bfee0032972cffc1207b77af63319746951bf1d09885d1dadf80 +F ext/fts5/fts5_vocab.c 906dff069840347e68f654b12ca60a53a27cd1780daf155fbe7dd331f27c2329 F ext/fts5/fts5parse.y eb526940f892ade5693f22ffd6c4f2702543a9059942772526eac1fde256bb05 F ext/fts5/mkportersteps.tcl 5acf962d2e0074f701620bb5308155fa1e4a63ba F ext/fts5/test/fts5_common.tcl b01c584144b5064f30e6c648145a2dd6bc440841 -F ext/fts5/test/fts5aa.test 840081efaee97f5ec570146bbdd79cfdfaea0ab303de3d5037b6d6c78b42ccdd +F ext/fts5/test/fts5aa.test 1706f816308e5855fe493be85aa0fd28eea78fb163ab1d60a20bca4f0ebcf68d F ext/fts5/test/fts5ab.test 9205c839332c908aaad2b01ab8670ece8b161e8f2ec8a9fabf18ca9385880bb7 F ext/fts5/test/fts5ac.test a7aa7e1fefc6e1918aa4d3111d5c44a09177168e962c5fd2cca9620de8a7ed6d F ext/fts5/test/fts5ad.test e8cf959dfcd57c8e46d6f5f25665686f3b6627130a9a981371dafdf6482790de @@ -136,9 +136,9 @@ F ext/fts5/test/fts5ae.test 1142d16d9cc193894dc13cc8f9c7a8a21411ac61b5567a878514 F ext/fts5/test/fts5af.test 724247405b13f8f06cc6ce464dc4f152dc5dd4e86b12c2099685d8f19747bf7b F ext/fts5/test/fts5ag.test 7816f25a0707578f08145ab539fc0ca025f8951e788b28a6a18a06b2099469dd F ext/fts5/test/fts5ah.test 27b5a33bfd0363ca8a4dc659e6e2a5df3dea1c3c5b04bc51ca6aeb1277bd9b21 -F ext/fts5/test/fts5ai.test d837c42249c0d8ad1a2912270e22cf2f303790a611f85c0be3a58e42a3696e3d +F ext/fts5/test/fts5ai.test bc97e4758cc93e06bf851d61c98fdf4e8b8f8315ee28a84fb15f916360856414 F ext/fts5/test/fts5aj.test 745020852d85f5dd49d11cb7ad11d3cc6dafc4fe6d6d24bc0875ac8f43ee4149 -F ext/fts5/test/fts5ak.test 0d41cbf04e70249c84670e1782aa8972e4f67d91c9bc6205d0ba7c34e159481b +F ext/fts5/test/fts5ak.test fc3595f8e6873bb86d70c9bd4b67d0413ce577bd4793c39a2b60a7b8825b60a6 F ext/fts5/test/fts5al.test 00c4c1c6a1366b73aa48ce2068c634520867c3cf7f5d1676ebbb775ee1f35734 F ext/fts5/test/fts5alter.test 5565f7e4605512b69171ac18ca84398603f9f6456dbe377beeca97e83cc242cd F ext/fts5/test/fts5auto.test 78989e6527ce69c9eddbef7392fea5c10b0010cd2b2ae68eec7bc869c471e691 @@ -147,6 +147,7 @@ F ext/fts5/test/fts5auxdata.test eacc97ff04892f1a5f3d4df5a73f8bcbc3955ea1d12c9f2 F ext/fts5/test/fts5bigpl.test 6466c89b38439f0aba26ac09e232a6b963f29b1cbe1304f6a664fe1e7a8f5fd3 F ext/fts5/test/fts5bigtok.test 541119e616c637caea925a8c028c37c2c29e94383e00aa2f9198d530724b6e36 F ext/fts5/test/fts5cat.test daba0b80659460b0cb60bd1f40b402478a761fe7ea414c3c94c2be25568cc33a +F ext/fts5/test/fts5circref.test f880dfd0d99f6fb73b88ccacb0927d18e833672fd906cc47d6b4e529419eaa62 F ext/fts5/test/fts5colset.test a30473451321bbf0b6218af62e96b4ae5fa99931cfdb210b5ecc804623b30f75 F ext/fts5/test/fts5columnsize.test 45459ce4dd9fd853b6044cdc9674921bff89e3d840f348ca8c1630f9edbf5482 F ext/fts5/test/fts5config.test 60094712debc59286c59aef0e6cf511c37d866802776a825ce437d26afe0817f @@ -155,7 +156,7 @@ F ext/fts5/test/fts5connect.test 08030168fc96fc278fa81f28654fb7e90566f33aff269c0 F ext/fts5/test/fts5content.test 688d5ac7af194ebc67495daea76a69e3cd5480122c2320e72d41241b423b4116 F ext/fts5/test/fts5corrupt.test 77ae6f41a7eba10620efb921cf7dbe218b0ef232b04519deb43581cb17a57ebe F ext/fts5/test/fts5corrupt2.test 7453752ba12ce91690c469a6449d412561cc604b1dec994e16ab132952e7805f -F ext/fts5/test/fts5corrupt3.test ff9aee403611461e2619d2217c0d7d101a9c0179277c13c8a89516d7cf0dda43 +F ext/fts5/test/fts5corrupt3.test 4c506a138797d23049bf08552b4571f5beb5138ab7b3329b9210fe5aac8796d2 F ext/fts5/test/fts5delete.test cbf87e3b8867c4d5cfcaed975c7475fd3f99d072bce2075fcedf43d1f82af775 F ext/fts5/test/fts5detail.test 31b240dbf6d44ac3507e2f8b65f29fdc12465ffd531212378c7ce1066766f54e F ext/fts5/test/fts5determin.test 1b77879b2ae818b5b71c859e534ee334dac088b7cf3ff3bf76a2c82b1c788d11 @@ -180,6 +181,7 @@ F ext/fts5/test/fts5full.test 49b565da02918c06e58f51f0b953b0302b96f155aa68baba24 F ext/fts5/test/fts5fuzz1.test 238d8c45f3b81342aa384de3e581ff2fa330bf922a7b69e484bbc06051a1080e F ext/fts5/test/fts5hash.test a4cf51acad99bfc43c16fb74f9d22495dc221ae0701fc5e908ca963a9b26a02b F ext/fts5/test/fts5integrity.test 4317561cd25eca7df16aa1f7d1a700ee958059fa639785f94aba0a84df9ab17b +F ext/fts5/test/fts5interrupt.test 09613247b273a99889808ef852898177e671406fe71fdde7ea00e78ea283d227 F ext/fts5/test/fts5lastrowid.test be98fe3e03235296585b72daad7aed5717ba0062bae5e5c18dd6e04e194c6b28 F ext/fts5/test/fts5leftjoin.test c0b4cafb9661379e576dc4405c0891d8fcc2782680740513c4d1fc114b43d4ad F ext/fts5/test/fts5matchinfo.test 79129ff6c9a2d86943b287a5a8caa7ee639f6dcf004d8975d15c279374e82e35 @@ -206,16 +208,17 @@ F ext/fts5/test/fts5synonym.test 1651815b8008de170e8e600dcacc17521d765482ea8f074 F ext/fts5/test/fts5synonym2.test b54cce5c34ec08ed616f646635538ae82e34a0e28f947ec60b6fadbc4b3fb17a F ext/fts5/test/fts5tok1.test ce6551e41ff56f30b69963577324624733bed0d1753589f06120d664d9cd45c9 F ext/fts5/test/fts5tok2.test dcacb32d4a2a3f0dd3215d4a3987f78ae4be21a2 -F ext/fts5/test/fts5tokenizer.test 6aeb5e8061ffc0ff9a5299f27beaee3b2b4b8b336d4f107262bca338bea8f8e9 +F ext/fts5/test/fts5tokenizer.test ac3c9112b263a639fb0508ae73a3ee886bf4866d2153771a8e8a20c721305a43 +F ext/fts5/test/fts5umlaut.test a42fe2fe6387c40c49ab27ccbd070e1ae38e07f38d05926482cc0bccac9ad602 F ext/fts5/test/fts5unicode.test 17056f4efe6b0a5d4f41fdf7a7dc9af2873004562eaa899d40633b93dc95f5a9 F ext/fts5/test/fts5unicode2.test 9b3df486de05fb4bde4aa7ee8de2e6dae1df6eb90e3f2e242c9383b95d314e3e -F ext/fts5/test/fts5unicode3.test c3caecbe8264629ffe653b43ca5790b9793eba4422f92203e5247558e5a534e7 +F ext/fts5/test/fts5unicode3.test 590c72e18195bda2446133f9d82d04a4e89d094bba58c75ae10f4afc6faa0744 F ext/fts5/test/fts5unicode4.test 6463301d669f963c83988017aa354108be0b947d325aef58d3abddf27147b687 F ext/fts5/test/fts5unindexed.test 9021af86a0fb9fc616f7a69a996db0116e7936d0db63892db6bafabbec21af4d -F ext/fts5/test/fts5update.test 0737876e20e97a6a6abf45de19fc99315727bcee6a83fadcada1cc080b9aa8f0 +F ext/fts5/test/fts5update.test b8affd796e45c94a4d19ad5c26606ea06065a0f162a9562d9f005b5a80ccf0bc F ext/fts5/test/fts5version.test c8f2cc105f0abf0224965f93e584633dee3e06c91478bc67e468f7cfdf97fd6a -F ext/fts5/test/fts5vocab.test 2de834ee6405130d3373817ced8fefbfee392b63d932e471740e09829f1e4510 -F ext/fts5/test/fts5vocab2.test d6039b20118e886113fc63614d9ad39a466fc2af34184f3e915b9f92b7ebfa10 +F ext/fts5/test/fts5vocab.test 648fb2fe86b55e08295e34504704718d92fba3e2cf3e1f5d72fa3682df4cd0f0 +F ext/fts5/test/fts5vocab2.test e0fdc3a3095f6eda68ac9bf9a443ff929a124d46f00af19933604085712e9d47 F ext/fts5/tool/fts5speed.tcl b0056f91a55b2d1a3684ec05729de92b042e2f85 F ext/fts5/tool/fts5txt2db.tcl 526a9979c963f1c54fd50976a05a502e533a4c59 F ext/fts5/tool/loadfts5.tcl 95b03429ee6b138645703c6ca192c3ac96eaf093 @@ -270,29 +273,31 @@ F ext/lsm1/test/lsm1_common.tcl 5ed4bab07c93be2e4f300ebe46007ecf4b3e20bc5fbe1ded F ext/lsm1/test/lsm1_simple.test ca949efefa102f4644231dcd9291d8cda7699a4ce1006b26e0e3fcb72233f422 F ext/lsm1/tool/mklsm1c.tcl f31561bbee5349f0a554d1ad7236ac1991fc09176626f529f6078e07335398b0 F ext/misc/README.md d6dd0fe1d8af77040216798a6a2b0c46c73054d2f0ea544fbbcdccf6f238c240 -F ext/misc/amatch.c c0a6a807a553eaa220bf69fca0353cd1587a3bfb3d2224fa425e3e6efcacc98a +F ext/misc/amatch.c cc9835931fbe46f9c6b8dbb51779c16f169bee50ae372a20532ff5154ebaf5b1 F ext/misc/anycollseq.c 5ffdfde9829eeac52219136ad6aa7cd9a4edb3b15f4f2532de52f4a22525eddb F ext/misc/appendvfs.c 3777f22ec1057dc4e5fd89f2fbddcc7a29fbeef1ad038c736c54411bb1967af7 F ext/misc/btreeinfo.c 4f0ebf278f46e68e6306c667917766cebc5550fd35d5de17847988e22892d4d2 F ext/misc/carray.c ed96c218ea940b85c9a274c4d9c59fe9491c299147a38a8bba537687bd6c6005 -F ext/misc/closure.c 9f8fa11aa6c6e2f6d7296ffa88f103df4b46abd9602bcab3ea2f8fc24f334f63 +F ext/misc/closure.c 037d055c5a4880d41607a3ea44037f655b5e8ac1bdce305ec497903fd2646960 F ext/misc/completion.c cec672d40604075bb341a7f11ac48393efdcd90a979269b8fe7977ea62d0547f F ext/misc/compress.c dd4f8a6d0baccff3c694757db5b430f3bbd821d8686d1fc24df55cf9f035b189 -F ext/misc/csv.c 88333dc9f7dcf6a8148406f10ae04261e24e3b4c721550ae33e9e71f1265c1f1 -F ext/misc/dbdump.c 12389a10c410fadf1e68eeb382def92d5a7fa9ce7cce4fb86a736fa2bac1000a -F ext/misc/eval.c 6ea9b22a5fa0dd973b67ca4e53555be177bc0b7b263aadf1024429457c82c0e3 +F ext/misc/csv.c 7f047aeb68f5802e7ce6639292095d622a488bb43526ed04810e0649faa71ceb +F ext/misc/dbdump.c baf6e37447c9d6968417b1cd34cbedb0b0ab3f91b5329501d8a8d5be3287c336 +F ext/misc/eval.c 4b4757592d00fd32e44c7a067e6a0e4839c81a4d57abc4131ee7806d1be3104e F ext/misc/explain.c d5c12962d79913ef774b297006872af1fccda388f61a11d37758f9179a09551f -F ext/misc/fileio.c e3153b04433897a18a3d17185845f286892e96fdf87f4301290d09c36ae1759f -F ext/misc/fuzzer.c 7c64b8197bb77b7d64eff7cac7848870235d4c25 +F ext/misc/fileio.c 592d6531d8413d81b25f5a47a45d7e310e455d33e03a64c6ae85724c6524a5d5 +F ext/misc/fuzzer.c 9e79c337faffdd4c5fe4485467537438359b43e0858a40038d4300b894ff553f F ext/misc/ieee754.c f190d0cc5182529acb15babd177781be1ac1718c -F ext/misc/json1.c 3f017d2659e531d021d015ec5d69ea0b1c71f2e15bf9768b1e149fcdf6c3e0b1 -F ext/misc/memstat.c 941928c6104d8ed569a6c47caa756dc78b8091f7a15f87d3004f3b1e576b10da +F ext/misc/json1.c 8af4672f43634257dbcfdb4515b4070325463d67c6968b4be1bd414de28d4d58 +F ext/misc/memstat.c 3017a0832c645c0f8c773435620d663855f04690172316bd127270d1a7523d4d +F ext/misc/memtrace.c 7c0d115d2ef716ad0ba632c91e05bd119cb16c1aedf3bec9f06196ead2d5537b F ext/misc/memvfs.c ab36f49e02ebcdf85a1e08dc4d8599ea8f343e073ac9e0bca18a98b7e1ec9567 -F ext/misc/mmapwarm.c 70b618f2d0bde43fae288ad0b7498a629f2b6f61b50a27e06fae3cd23c83af29 -F ext/misc/nextchar.c 35c8b8baacb96d92abbb34a83a997b797075b342 +F ext/misc/mmapwarm.c 8c5fe90d807a23e44a8b93e96e8b812b19b300d5fd8c1d40a4fd1d8224e33f46 +F ext/misc/nextchar.c 279f80fe8ef5ba413242e2704e246503ac601f005eefb180d19e6c920338a0ba F ext/misc/normalize.c b4290464f542bae7a97b43f15bd197949b833ffd668b7c313631bd5d4610212c -F ext/misc/percentile.c 92699c8cd7d517ff610e6037e56506f8904dae2e -F ext/misc/regexp.c a68d25c659bd2d893cd1215667bbf75ecb9dc7d4 +F ext/misc/percentile.c a6a1594c104da2d0ceab38fe609eb2f65529272377827f6f8a2b5c9fa6119e7e +F ext/misc/prefixes.c 7be86d17525cfae6ed462fc3c519efc44488ac329890f77491c8f82871f57e17 +F ext/misc/regexp.c 79345bf03496155a640ee0300d3307296761cebb5e115b4e342cc2fb5861ec10 F ext/misc/remember.c add730f0f7e7436cd15ea3fd6a90fd83c3f706ab44169f7f048438b7d6baa69c F ext/misc/rot13.c 540a169cb0d74f15522a8930b0cccdcb37a4fd071d219a5a083a319fc6e8db77 F ext/misc/scrub.c db9fff56fed322ca587d73727c6021b11ae79ce3f31b389e1d82891d144f22ad @@ -305,13 +310,13 @@ F ext/misc/sqlar.c 57d5bc45cd5492208e451f697404be88f8612527d64c9d42f96b325b64983 F ext/misc/stmt.c 8a8dc4675042e4551e4afe99b8d0cc7a4a2fc1a8dacc0a9ce1b1bbff145da93d F ext/misc/templatevtab.c 8a16a91a5ceaccfcbd6aaaa56d46828806e460dd194965b3f77bf38f14b942c4 F ext/misc/totype.c 4a167594e791abeed95e0a8db028822b5e8fe512 -F ext/misc/unionvtab.c acf947858054850db2d4a611bfeae072cdc6d9f517b46a993fe1f2f1ea20031e -F ext/misc/vfslog.c fe40fab5c077a40477f7e5eba994309ecac6cc95 +F ext/misc/unionvtab.c 34ee634d09670909563dbde59c5bfb2ac048b27051f65f1aeac918b061d646d8 +F ext/misc/vfslog.c 3b25c2f56ba60788db247287be6ab024b53c4afffd412b4876db563389be0d35 F ext/misc/vfsstat.c bf10ef0bc51e1ad6756629e1edb142f7a8db1178 F ext/misc/vtablog.c 5538acd0c8ddaae372331bee11608d76973436b77d6a91e8635cfc9432fba5ae F ext/misc/vtshim.c 1976e6dd68dd0d64508c91a6dfab8e75f8aaf6cd F ext/misc/wholenumber.c 784b12543d60702ebdd47da936e278aa03076212 -F ext/misc/zipfile.c 1d731db326c40e11fc608f38132acff31619946c000e85ab8efe75bbedc2a441 +F ext/misc/zipfile.c c1ca8f52330b4564207036b978edac8141c737bf612659bf6f7bee3ddd563a03 F ext/misc/zorder.c b0ff58fa643afa1d846786d51ea8d5c4b6b35aa0254ab5a82617db92f3adda64 F ext/rbu/rbu.c 8681f6157db6adc82c34af24b14ea8a3be0146ad2a3b6c1d5da6cb8a5796c8ce F ext/rbu/rbu1.test 221d9c18a5e600ac9ac6b1810d99d9f99163a7909ba61597876ab6e4d4beb3d6 @@ -329,7 +334,7 @@ F ext/rbu/rbu9.test 0e4d985e25620d61920597e8ea69c871c9e8c1f5a0be2ae9fa70bb641d74 F ext/rbu/rbuA.test b34a90cb495682c25b5fc03a9d5e7a4fc99541c29256f25e2e2a4f6542b4f5b3 F ext/rbu/rbuB.test 52b07158824c6927b7e25554ace92a695cdebfc296ae3d308ac386984aded9bc F ext/rbu/rbuC.test 80f1cc2fb74f44b1128fd0ed8eedab3a76fefeb72a947860e2869ef76fc8dc6b -F ext/rbu/rbu_common.tcl acfb7fbbaf8d46a9f6f6a5ec795616c84d705e1565d918afe43f0ff53ea0efa5 +F ext/rbu/rbu_common.tcl 4b3d033b3e3844292ae3a1aefc0e524e64b0db5a0e4310657919e4504ac3073f F ext/rbu/rbucollate.test cac528a9a46318cba42e61258bb42660bbbf4fdb9a8c863de5a54ad0c658d197 F ext/rbu/rbucrash.test 000981a1fe8a6e4d9a684232f6a129e66a3ef595f5ed74655e2f9c68ffa613b4 F ext/rbu/rbucrash2.test efa143cc94228eb0266d3f1abfbee60a5838a84cef7cc3fcb8c145b74d96fd41 @@ -347,10 +352,11 @@ F ext/rbu/rbusave.test f4190a1a86fccf84f723af5c93813365ae33feda35845ba107b59683d F ext/rbu/rbusplit.test b37e7b40b38760881dc9c854bd40b4744c6b6cd74990754eca3bda0f407051e8 F ext/rbu/rbutemplimit.test 7f408f49b90fa0a720d7599f3aec74a3c85e6cd78e56fdf726ce00af9147a341 F ext/rbu/rbuvacuum.test 55e101e90168c2b31df6c9638fe73dc7f7cc666b6142266d1563697d79f73534 -F ext/rbu/rbuvacuum2.test 0a7669bbabdaeed915f02f59f33fe20e13d4932ba2086fe00a82064d9424c80b -F ext/rbu/sqlite3rbu.c 71f8c09948d09ec9c5a8dbe7127e8ef61ef0853e698b2650be2485ac7b9c75c8 -F ext/rbu/sqlite3rbu.h b42bcd4d8357268c6c39ab2a60b29c091e89328fa8cc49c8fac5ab8d007e79b2 -F ext/rbu/test_rbu.c baa23eb28457580673d2175e5f0c29ced0cd320ee819b13ad362398c53b96e90 +F ext/rbu/rbuvacuum2.test b8e5b51dc8b2c0153373d024c0936be3f66f9234acbd6d0baab0869d56b14e6b +F ext/rbu/rbuvacuum3.test 8addd82e4b83b4c93fa47428eae4fd0dbf410f8512c186f38e348feb49ba03dc +F ext/rbu/sqlite3rbu.c d643661c7c85e79f4d0bc56c73f6f2dd55c35732dd41f378b0fd3b182a33242d +F ext/rbu/sqlite3rbu.h 1dc88ab7bd32d0f15890ea08d23476c4198d3da3056985403991f8c9cd389812 +F ext/rbu/test_rbu.c 03f6f177096a5f822d68d8e4069ad8907fe572c62ff2d19b141f59742821828a F ext/repair/README.md 92f5e8aae749a4dae14f02eea8e1bb42d4db2b6ce5e83dbcdd6b1446997e0c15 F ext/repair/checkfreelist.c 0dbae18c1b552f58d64f8969e4fb1e7f11930c60a8c2a9a8d50b7f15bdfd54bd F ext/repair/checkindex.c 7d28c01a2e012ac64257d230fc452b2cafb78311a91a343633d01d95220f66f3 @@ -361,15 +367,15 @@ F ext/repair/test/checkfreelist01.test 3e8aa6aeb4007680c94a8d07b41c339aa635cc782 F ext/repair/test/checkindex01.test b530f141413b587c9eb78ff734de6bb79bc3515c335096108c12c01bddbadcec F ext/repair/test/test.tcl 686d76d888dffd021f64260abf29a55c57b2cedfa7fc69150b42b1d6119aac3c F ext/rtree/README 6315c0d73ebf0ec40dedb5aa0e942bc8b54e3761 -F ext/rtree/geopoly.c d56ff997f2646b03be742eb85e8206f779d777f3a282fe0da576780ca0e11f20 -F ext/rtree/rtree.c 7125183bf6c37b8b8ee1a04d2b0fe258531fd31650fdd050ed041817f1943d17 +F ext/rtree/geopoly.c 061432bddc38c4c10c7e4ce940d581c886d65bb5814b4b65b46ad046aa85eaa2 +F ext/rtree/rtree.c 57729cc19f3832e5f9051556af44ed264b5bd54b01543cd7e50d5143817b964c F ext/rtree/rtree.h 4a690463901cb5e6127cf05eb8e642f127012fd5003830dbc974eca5802d9412 -F ext/rtree/rtree1.test 309afc04d4287542b2cd74f933296832cc681c7b014d9405cb329b62053a5349 +F ext/rtree/rtree1.test 7573134f1b4f59df36c1b0a6de51268fd3b9c714d91f3811482263e734e416ea F ext/rtree/rtree2.test 5f25b01acd03470067a2d52783b2eb0a50bf836803d4342d20ca39e541220fe2 F ext/rtree/rtree3.test 4ee5d7df86040efe3d8d84f141f2962a7745452200a7cba1db06f86d97050499 F ext/rtree/rtree4.test 304de65d484540111b896827e4261815e5dca4ce28eeecd58be648cd73452c4b F ext/rtree/rtree5.test 49c9041d713d54560b315c2c7ef7207ee287eba1b20f8266968a06f2e55d3142 -F ext/rtree/rtree6.test 593e0d36510d5ac1d1fb39b018274ff17604fe8fdca8cf1f8e16559cea1477f4 +F ext/rtree/rtree6.test 1252a0439da01d2f1f5cbbdeeb80455a2d68b9bae2a9787937b167a5e3957828 F ext/rtree/rtree7.test c8fb2e555b128dd0f0bdb520c61380014f497f8a23c40f2e820acc9f9e4fdce5 F ext/rtree/rtree8.test 2d99006a1386663978c9e1df167554671e4f711c419175b39f332719deb1ce0e F ext/rtree/rtree9.test c646f12c8c1c68ef015c6c043d86a0c42488e2e68ed1bb1b0771a7ca246cbabf @@ -384,14 +390,16 @@ F ext/rtree/rtreeH.test aa08cc4fa8005b4c67446c7110205055b4d6da90e760e6f44b82dfa4 F ext/rtree/rtree_perf.tcl 6c18c1f23cd48e0f948930c98dfdd37dfccb5195 F ext/rtree/rtree_util.tcl db734b4c5e75fed6acc56d9701f2235345acfdec750b5fc7b587936f5f6bceed F ext/rtree/rtreecheck.test d67d5b3e9e45bfa8cd90734e8e9302144ac415b8e9176c6f02d4f92892ee8a35 +F ext/rtree/rtreecirc.test aec664eb21ae943aeb344191407afff5d392d3ae9d12b9a112ced0d9c5de298e F ext/rtree/rtreeconnect.test 225ad3fcb483d36cbee423a25052a6bbae762c9576ae9268332360c68c170d3d +F ext/rtree/rtreefuzz001.test 836d87653851ae8e7b506d8bd3d62329548adc48ff9bc0a9051efd576710be7b F ext/rtree/sqlite3rtree.h 03c8db3261e435fbddcfc961471795cbf12b24e03001d0015b2636b0f3881373 F ext/rtree/tkt3363.test 142ab96eded44a3615ec79fba98c7bde7d0f96de F ext/rtree/util/randomshape.tcl 54ee03d0d4a1c621806f7f44d5b78d2db8fac26e0e8687c36c4bd0203b27dbff F ext/rtree/viewrtree.tcl eea6224b3553599ae665b239bd827e182b466024 F ext/rtree/visual01.txt e9c2564083bcd30ec51b07f881bffbf0e12b50a3f6fced0c222c5c1d2f94ac66 -F ext/session/changeset.c 4ccbaa4531944c24584bf6a61ba3a39c62b6267a -F ext/session/changesetfuzz.c 255826ee367781ec4c29a36c7c63e9ee6387dc03a8346cf240feb8d597958b0e +F ext/session/changeset.c d046906a0c9a37862fcd5dbfda5eb08dea361b9abdd959b34358a63fa246164f +F ext/session/changesetfuzz.c 01023c41cfb02e191d144ea8bfdc46443393b62d13873f5fa044fc9886e60142 F ext/session/changesetfuzz1.test 2e1b90d888fbf0eea5e1bd2f1e527a48cc85f8e0ff75df1ec4e320b21f580b3a F ext/session/session1.test 0b2f88995832ea040ae8e83a1ad4afa99c00b85c779d213da73a95ea4113233e F ext/session/session2.test 284de45abae4cc1082bc52012ee81521d5ac58e0 @@ -410,7 +418,7 @@ F ext/session/sessionF.test d37ed800881e742c208df443537bf29aa49fd56eac520d0f0c6d F ext/session/sessionG.test 3828b944cd1285f4379340fd36f8b64c464fc84df6ff3ccbc95578fd87140b9c F ext/session/sessionH.test a417559f29a7e775950fc5fc82b3d01256a7cbe793ddf1180df234df823d56e2 F ext/session/session_common.tcl 29ec9910aca1e996ca1c8531b8cecabf96eb576aa53de65a8ff03d848b9a2a8b -F ext/session/session_speed_test.c edc1f96fd5e0e4b16eb03e2a73041013d59e8723 +F ext/session/session_speed_test.c dcf0ef58d76b70c8fbd9eab3be77cf9deb8bc1638fed8be518b62d6cbdef88b3 F ext/session/sessionat.test efe88965e74ff1bc2af9c310b28358c02d420c1fb2705cc7a28f0c1cc142c3ec F ext/session/sessiondiff.test ad13dd65664bae26744e1f18eb3cbd5588349b7e9118851d8f9364248d67bcec F ext/session/sessionfault.test da273f2712b6411e85e71465a1733b8501dbf6f7 @@ -418,9 +426,9 @@ F ext/session/sessionfault2.test dd593f80b6b4786f7adfe83c5939620bc505559770cc181 F ext/session/sessioninvert.test ae1a003a9ab1f8d64227dbb5c3a4c97e65b561b01e7b2953cf48683fb2724169 F ext/session/sessionrebase.test ccfa716b23bd1d3b03217ee58cfd90c78d4b99f53e6a9a2f05e82363b9142810 F ext/session/sessionstat1.test 218d351cf9fcd6648f125a26b607b140310160184723c2666091b54450a68fb5 -F ext/session/sessionwor.test 07f0b304dc4df5454906069140bf6ec67edcaa3c548f3683354003cf2c22b64a -F ext/session/sqlite3session.c dbd6f7a89c1236d8e7b58f4e217391670ce91b9e6f85c16ba02832674ef0cf3c -F ext/session/sqlite3session.h 05351d2f50a1203fdffbeb590fdbbc796c9a6bfcd0c9b26cf6db3854e3eb4294 +F ext/session/sessionwor.test 67b5ab91d4f93ce65ff1f58240ac5ddf73f8670facc1ffa49cef56293d52818d +F ext/session/sqlite3session.c 4c79daf65e89c78dd62fd97a1b2eac3e53be700b29914101453a0d951f7ba9c8 +F ext/session/sqlite3session.h 54d6356f5769d3695e5f63d719c6ee27671b2614973a2b675a3ff4d30d574233 F ext/session/test_session.c 98797aba475a799376c9a42214f2d1debf2d0c3cb657d9c8bbf4f70bf3fb4aec F ext/userauth/sqlite3userauth.h 7f3ea8c4686db8e40b0a0e7a8e0b00fac13aa7a3 F ext/userauth/user-auth.txt e6641021a9210364665fe625d067617d03f27b04 @@ -428,7 +436,7 @@ F ext/userauth/userauth.c f81aa5a3ecacf406f170c62a144405858f6f6de51dbdc0920134e6 F install-sh 9d4de14ab9fb0facae2f48780b874848cbf2f895 x F ltmain.sh 3ff0879076df340d2e23ae905484d8c15d5fdea8 F magic.txt 8273bf49ba3b0c8559cb2774495390c31fd61c60 -F main.mk eeaa279fa6acdcfa6555058548075569a06f891fd67f5901b1e7700d18052fda +F main.mk 3930eb2fcbebe49ab7408f6fef3baa8c4bf3c84540f9f29dfe849bf561ff6e51 F mkso.sh fd21c06b063bb16a5d25deea1752c2da6ac3ed83 F mptest/config01.test 3c6adcbc50b991866855f1977ff172eb6d901271 F mptest/config02.test 4415dfe36c48785f751e16e32c20b077c28ae504 @@ -440,44 +448,44 @@ F spec.template 86a4a43b99ebb3e75e6b9a735d5fd293a24e90ca F sqlite.pc.in 42b7bf0d02e08b9e77734a47798d1a55a9e0716b F sqlite3.1 fc7ad8990fc8409983309bb80de8c811a7506786 F sqlite3.pc.in 48fed132e7cb71ab676105d2a4dc77127d8c1f3a -F src/alter.c f886160da189e4e99093cd5a2aca625652cc9b027d5100b87f81c175d1056387 -F src/analyze.c 3dc6b98cf007b005af89df165c966baaa48e8124f38c87b4d2b276fe7f0b9eb9 -F src/attach.c 92b51739a885da8bd84bc9a05485f1e48148bce5c15432f059b45af98fff75cd +F src/alter.c cb691d6cd330312b7951c9d3bc0bc29804bbe80beac1cdd137d824b119b6f28a +F src/analyze.c 58db66344a5c58dcabb57f26696f6f2993956c830446da40b444051d2fdaf644 +F src/attach.c 3f9b0f6c79500cc40f4e543bc130a0b4ee13f52b45cbb6735608776cbdb79f0e F src/auth.c 0fac71038875693a937e506bceb492c5f136dd7b1249fbd4ae70b4e8da14f9df F src/backup.c 78d3cecfbe28230a3a9a1793e2ead609f469be43e8f486ca996006be551857ab F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 8acc2f464ee76324bf13310df5692a262b801808984c1b79defb2503bbafadb6 -F src/btree.c ba7c7eef4461790f37c309936bfc5d0d6ba9b194b02d3c8ff1fd53b420ea6d3b -F src/btree.h febb2e817be499570b7a2e32a9bbb4b607a9234f6b84bb9ae84916d4806e96f2 -F src/btreeInt.h 620ab4c7235f43572cf3ac2ac8723cbdf68073be4d29da24897c7b77dda5fd96 -F src/build.c 127d33ad57b455a9339e9fabff41284c8b030cc6247ca7a2a6c0ad7abfc1ce85 -F src/callback.c 789bd33d188146f66c0dd8306472a72d1c05f71924b24a91caf6bd45cf9aba73 +F src/btree.c 84b7c5c3829b60823e15e7a8407462b69be3818f96518fef28f97ac0fbbca72b +F src/btree.h 63b94fb38ce571c15eb6a3661815561b501d23d5948b2d1e951fbd7a2d04e8d3 +F src/btreeInt.h cd82f0f08886078bf99b29e1a7045960b1ca5d9d5829c38607e1299c508eaf00 +F src/build.c 906ca6663b9dcd413e72ae9c44dd51e596d8336b04d52e678a7501e71c20cab2 +F src/callback.c 25dda5e1c2334a367b94a64077b1d06b2553369f616261ca6783c48bcb6bda73 F src/complete.c a3634ab1e687055cd002e11b8f43eb75c17da23e F src/ctime.c 109e58d00f62e8e71ee1eb5944ac18b90171c928ab2e082e058056e1137cc20b F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 -F src/dbstat.c 3c8bd4e77f0244fd2bd7cc90acf116ad2f8e82d70e536637f35ac2bc99b726f9 -F src/delete.c f7938125847e8ef485448db5fbad29acb2991381a02887dd854c1617315ab9fb -F src/expr.c 9aacc0b72348ba90010b672dcbbbe2fa56e1182043bc917a3a147b2bc57a5497 +F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 +F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf +F src/expr.c 182dc9ff30aa6a430b7f728ce84fda85ec10890e29fdf75be1e871d13222a99c F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 -F src/fkey.c 972a4ba14296bef2303a0abbad1e3d82bc3c61f9e6ce4e8e9528bdee68748812 -F src/func.c 7c288b4ce309b5a8b8473514b88e1f8e69a80134509a8c0db8e39c858e367e7f -F src/global.c 8291eee0782b83124de14ec0389ec9fd6ae1873358a6b0d9469fe17a46ad803b -F src/hash.c 931ec82d7e070654a8facb42549bbb3a25720171d73ba94c3d3160580d01ef1f +F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 +F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 +F src/global.c 0dea3065ea72a65ae941559b6686aad6516d4913e76fa4f79a95ff7787f624ec +F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 6b81aae27b196925d8ff78824f4bbd435d6a40cd38dc324685e21735bb402109 -F src/legacy.c 134ab3e3fae00a0f67a5187981d6935b24b337bcf0f4b3e5c9fa5763da95bf4e -F src/loadext.c 9050dd153b5583804184be9c9dee9ebb554178d6db1f8ac280899e8aad9060e6 -F src/main.c 4cfb3913cc9e65d3ac649b1785ac753fc225d29425d5437e012f7eac0cefe0eb +F src/insert.c 3ed9ceaa4b7d56a6f2613355e1cd1ae5cfe31712bce2bf5aa93c5f1f130704b2 +F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa +F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 +F src/main.c 27d7265625ea6eaccdfe7c53ef41adc179c9357a077702a860c1a3b0a037a16f F src/malloc.c 07295435093ce354c6d9063ac05a2eeae28bd251d2e63c48b3d67c12c76f7e18 F src/mem0.c 6a55ebe57c46ca1a7d98da93aaa07f99f1059645 F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3 F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944 -F src/memdb.c cb4013d56fa71c79c498717cbc47b27dd1c7653fd866584b2071ae04114eec46 +F src/memdb.c 02a5fcec19b9d40dd449ca802dc1b2e8f93f255fbf2a886277a3c3800d8d35db F src/memjournal.c 6f3d36a0a8f72f48f6c3c722f04301ac64f2515435fa42924293e46fc7994661 F src/msvc.h 4942752b6a253116baaa8de75256c51a459a5e81 F src/mutex.c bae36f8af32c22ad80bbf0ccebec63c252b6a2b86e4d3e42672ff287ebf4a604 @@ -493,30 +501,30 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c f6e91b8fd82af7afbfd073c4974ad6cdb8e62d9f65ceddb45167835a0567fdc0 F src/os_win.c 85d9e532d0444ab6c16d7431490c2e279e282aa0917b0e988996b1ae0de5c5a0 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 75e0f3cfa3962c714f519f8a3d1e67ecca1c91de0e010a036b988e40ce9e4c73 +F src/pager.c 857dde3e525f665cfab23b6765bf04ca6638c0759ae7da6d63acfb463e230aa6 F src/pager.h 217921e81eb5fe455caa5cda96061959706bcdd29ddb57166198645ef7822ac3 -F src/parse.y 6840fe7c0b5eb4dd25ee5d075213bc8255ed4c0678d71bfb6744d0520d91c179 +F src/parse.y 741a270b7f2f85bc5d026d06fb5a9ccba5335304ff2831e1cb44b36cd0da6006 F src/pcache.c 696a01f1a6370c1b50a09c15972bc3bee3333f8fcd1f2da8e9a76b1b062c59ee F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 -F src/pcache1.c bf9fcea656dce1cd2cca6b77a1d1d3552050d55a31c98bf0d9f405930a83bc95 -F src/pragma.c 4e056f042683b99c4ea0db395f68d051b1a95833ab40951c40d3ef7e1fee1354 -F src/pragma.h fdd03d78a7497f74a3f652909f945328480089189526841ae829ce7313d98d13 -F src/prepare.c f81f8d707e583192c28fea0b2e19385415b7d188123b23f49b038076408d7a69 -F src/printf.c 0f1177cf1dd4d7827bf64d840768514ec76409abecaca9e8b577dbd065150381 +F src/pcache1.c a72804486dfa8e4b6bc30d666c97ecf1155f91a4351fc6e48ea4097e4eb304fb +F src/pragma.c af67dedaad8bafe9a5f9adcec32a0da6dd118617dd8220ad1d118f5a6bf83a02 +F src/pragma.h a776bb9c915207e9d1117b5754743ddf1bf6a39cc092a4a44e74e6cb5fab1177 +F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 +F src/printf.c cbf27c320091a83279d1738f68a27a9fe01698c607ce80516ab6bdb5a9c36a1a F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c 4cfc44def0f0690ceaab8f6481f5d76284d7f9509aab6e218a679b4836a54614 +F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 -F src/select.c 61e867a906f140b73baf4ce7a201ad6dcba30820969f5618ee40e9a0d32c6f5f -F src/shell.c.in 482e23a370cbe5b0d4c73a0f0f5fce34f7caa08a14a8d75e12f0225c4e14915c -F src/sqlite.h.in cce9feede1c1c03923c091b4bbbd081dd77aaf92024cc2cdbf65f712c2f668c3 +F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 +F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251d +F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h 1161f7579cdd6217737a66517ef27f4016426603eff492e9b31f45a7d7d4c61f +F src/sqliteInt.h f657e35d824fdc17ddf46bb85f0193df3b965e8354ded9ec37825057e3224bcc F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 -F src/tclsqlite.c e72862a271348d779672b45a730c33fd0c535e630ff927e8ce4a0c908d1d28c6 -F src/test1.c 5390e5afb31fed61f72d0be0cb1b322d198a6e03fc13ff245ae76d17b4dcf2e9 +F src/tclsqlite.c 6b19e7562195aaf881f3e35e2472dc01ae3cb156961db5126c3d616744729b7e +F src/test1.c 353b066e7ec761c4c715c1c20b888e0e7a0b0c0eda7f68c110e032d63713cade F src/test2.c 3efb99ab7f1fc8d154933e02ae1378bac9637da5 F src/test3.c 61798bb0d38b915067a8c8e03f5a534b431181f802659a6616f9b4ff7d872644 F src/test4.c 18ec393bb4d0ad1de729f0b94da7267270f3d8e6 @@ -541,7 +549,7 @@ F src/test_hexio.c 1d4469ca61ab202a1fcec6543f584d2407205e8d F src/test_init.c 4413c211a94b62157ca4c145b3f27c497f03c664 F src/test_intarray.c 39b4181662a0f33a427748d87218e7578d913e683dc27eab7098bb41617cac71 F src/test_intarray.h d57ae92f420cda25e22790dac474d60961bd0c500cbaa3338a05152d4a669ef7 -F src/test_journal.c 619f2aa10e0d7a5f87c0f06825bc61dfce1c6b9c7f3ad990fb13de6c3b8874a3 +F src/test_journal.c a0b9709b2f12b1ec819eea8a1176f283bca6d688a6d4a502bd6fd79786f4e287 F src/test_loadext.c 337056bae59f80b9eb00ba82088b39d0f4fe6dfd F src/test_malloc.c dec0aa821b230773aeb3dd11d652c1193f7cedb18a20b25659bc672288115242 F src/test_md5.c 7268e1e8c399d4a5e181b64ac20e1e6f3bc4dd9fc87abac02db145a3d951fa8c @@ -562,40 +570,40 @@ F src/test_syscall.c 1073306ba2e9bfc886771871a13d3de281ed3939 F src/test_tclsh.c 06317648b0d85a85fd823f7973b55535c59a3156c1ef59394fe511f932cfa78d F src/test_tclvar.c 33ff42149494a39c5fbb0df3d25d6fafb2f668888e41c0688d07273dcb268dfc F src/test_thread.c 911d15fb14e19c0c542bdc8aabf981c2f10a4858 -F src/test_vfs.c 112f1f9271c33c211812e0e681830a84262dac065da58579ff49f9cefec97d4f +F src/test_vfs.c c6c6a58f66b26876c7b5769fb323a58b2c7120299b5084e7212c4116f902cbaa F src/test_vfstrace.c bab9594adc976cbe696ff3970728830b4c5ed698 F src/test_windirent.c a895e2c068a06644eef91a7f0a32182445a893b9a0f33d0cdb4283dca2486ac1 F src/test_windirent.h 90dfbe95442c9762357fe128dc7ae3dc199d006de93eb33ba3972e0a90484215 F src/test_window.c cdae419fdcea5bad6dcd9368c685abdad6deb59e9fc8b84b153de513d394ba3f F src/test_wsd.c 41cadfd9d97fe8e3e4e44f61a4a8ccd6f7ca8fe9 F src/threads.c 4ae07fa022a3dc7c5beb373cf744a85d3c5c6c3c -F src/tokenize.c 9e781e1ca80eefe7b5d6a9e2cd5c678c847da55fd6f093781fad7950934d4c83 -F src/treeview.c 7b12ac059de54c939b6eb0dbffc9410c29c80d2470cee5cbe07d5ff9ea2d9253 -F src/trigger.c d3d78568f37fb2e6cdcc2d1e7b60156f15b0b600adec55b83c5d42f6cad250bd -F src/update.c 1816d56c1bca1ba4e0ef98cac2f49be62858e9df1dc08844c7067eb41cc44274 +F src/tokenize.c 0a065eaa31f494ba31ac21d4a5d24a5a7865a7d849459f8c6266df1ac6b9aedf +F src/treeview.c c6ff90da4cc1813ff2d9bb11f17d4d927db62c47e552faa1835edc47269d753d +F src/trigger.c bb034c08eca111e66a19cda045903a12547c1be2294b5570d794b869d9c44a73 +F src/update.c 0b973357d88092140531e07ff641139c26fb4380b0b9f5ed98c5f7691b4604d1 F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 -F src/util.c d9eb0a6c4aae1b00a7369eadd7ca0bbe946cb4c953b6751aa20d357c2f482157 -F src/vacuum.c 836cadc922de866c849e23a75f93d344cdc143d388339305d09a3fed27e8798d -F src/vdbe.c 005e691ea4c7d51e6c1a69d9389aeb34700884c85f51681817ddea3fdc2fc39b -F src/vdbe.h 5081dcc497777efe5e9ebe7330d283a044a005e4bdda2e2e984f03bf89a0d907 -F src/vdbeInt.h 437e6c6af679fdf157867eb83a8adc6cf5145d6774453c2214cfd0bd01d92980 -F src/vdbeapi.c ecccfce6f614c33a95952efeec969d163e8349eac314ee2b7b163eda921b5eb0 -F src/vdbeaux.c f547901b1aa9e2d81c63f06893f633648e434180666a827aacb547d7d6c8a601 +F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 +F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca +F src/vdbe.c b7b6f965153607072917dbd81d654a268abf4872c58d556701d1549550766c02 +F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 +F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f +F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 +F src/vdbeaux.c 4fa28b32452f6197dba7c8780dde11576b9a6d8ce6f35adbb69efc3e7d37fa0c F src/vdbeblob.c f5c70f973ea3a9e915d1693278a5f890dc78594300cf4d54e64f2b0917c94191 -F src/vdbemem.c 7b3305bc4a5139f4536ac9b5f61da0f915e49d2e3fdfa87dfdfa9d7aba8bc1e9 +F src/vdbemem.c 3173f0275cf8643a03ed02084ee56b97fc1a17a2edb5907facec504f59c3172d F src/vdbesort.c 90aad5a92608f2dd771c96749beabdb562c9d881131a860a7a5bccf66dc3be7f F src/vdbetrace.c 79d6dbbc479267b255a7de8080eee6e729928a0ef93ed9b0bfa5618875b48392 -F src/vtab.c 70188a745dc4e57d26e942681ff4b2912b7c8249ad5de3f60f0677b4337bcfaa +F src/vtab.c 2462b7d6fd72b0b916477f5ef210ee49ab58cec195483ebdac0c8c5e3ec42cab F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 F src/wal.c 3f4f653daf234fe713edbcbca3fec2350417d159d28801feabc702a22c4e213f F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a -F src/walker.c fb94aadc9099ff9c6506d0a8b88d51266005bcaa265403f3d7caf732a562eb66 -F src/where.c 3818e8a736a05d2cb194e64399af707e367fbcc5c251d785804d02eaf121288e -F src/whereInt.h f125f29fca80890768e0b2caa14f95db74b2dacd3a122a168f97aa7b64d6968f -F src/wherecode.c c45f03aefc2266b990df0fc4d7acc4e27f56f881f4fc0fc355b7cbc4d7189da5 -F src/whereexpr.c 491f0894ad9903750cdecb7894437a0cabdffdd88f574d2b1c9ac85d14fe4b9c -F src/window.c 6550e2850ebced51100ef83d49b00a1cf03f81a482dafedafb0320df647ed8fc +F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 +F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 +F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 +F src/wherecode.c a571d8d7c19d6db786a201f2df8788b320fefcb2842f2a1eb9a85b85e91bc35f +F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 +F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 F test/affinity2.test a6d901b436328bd67a79b41bb0ac2663918fe3bd F test/affinity3.test 6a101af2fc945ce2912f6fe54dd646018551710d @@ -609,12 +617,13 @@ F test/alter3.test 4d79934d812eaeacc6f22781a080f8cfe012fdc3 F test/alter4.test 7e93a21fe131e1dfeb317e90056856f96b10381fc7fe3a05e765569a23400433 F test/alterauth.test 63442ba61ceb0c1eeb63aac1f4f5cebfa509d352276059d27106ae256bafc959 F test/alterauth2.test c0a1ddf5b93d93cb0d15ba7acaf0c5c6fb515bbe861ede75b2d3fabad33b6499 -F test/altercol.test 313ed080ed61691c52cd87053129889f71582d6d0efebdd5f3edad2a98c66874 +F test/altercol.test 54374d2ba18af25bb24e23acf18a60270d4ec120b7ec0558078b59d5aa1a31ad F test/alterlegacy.test 82022721ce0de29cedc9a7af63bc9fcc078b0ee000f8283b4b6ea9c3eab2f44b F test/altermalloc.test 167a47de41b5c638f5f5c6efb59784002b196fff70f98d9b4ed3cd74a3fb80c9 F test/altermalloc2.test fa7b1c1139ea39b8dec407cf1feb032ca8e0076bd429574969b619175ad0174b -F test/altertab.test 17e46baa6b2234048c91891a303141afceca4da95a36ee1a0a9fec6ccef1f4da -F test/altertab2.test 0d64de5632ca5de13b023839cfe5b8952d029e4622befcea1433adaa93883220 +F test/altertab.test 6e13f13d8c30708f16187908c31dadb1bfff9e3cb2a07a7392a7a5e076f58f4a +F test/altertab2.test 7bedde2e6e71fdecd7a2af64b696cd0b3d3a344f5cf1db6785d9e3b5665193cf +F test/altertab3.test 9dd97ab8161eb6afc0e30e7c61a38336687fbd09e6ddc4c9f1e450cc0b12160b F test/amatch1.test b5ae7065f042b7f4c1c922933f4700add50cdb9f F test/analyze.test 7168c8bffa5d5cbc53c05b7e9c7fcdd24b365a1bc5046ce80c45efa3c02e6b7c F test/analyze3.test ff62d9029e6deb2c914490c6b00caf7fae47cc85cdc046e4a0d0a4d4b87c71d8 @@ -650,7 +659,7 @@ F test/auth2.test 9eb7fce9f34bf1f50d3f366fb3e606be5a2000a1 F test/auth3.test db21405b95257c24d29273b6b31d0efc59e1d337e3d5804ba2d1fd4897b1ae49 F test/autoanalyze1.test b9cc3f32a990fa56669b668d237c6d53e983554ae80c0604992e18869a0b2dec F test/autoinc.test 381f494fefa90acd999933829e2934efb6b40906db9d6a39e822e3f7b4c8bf61 -F test/autoindex1.test a09958fa756129af10b6582bcbf3cbdf11e305e027b393f393caef801159dee0 +F test/autoindex1.test 96185415f5faacd5b8d7a7f505efddd5abb1f111d58338e9c0b1dc40b87cd3cc F test/autoindex2.test 12ef578928102baaa0dc23ad397601a2f4ecb0df F test/autoindex3.test 2dd997d6590438b53e4f715f9278aa91c9299cf3f81246a0915269c35beb790e F test/autoindex4.test 49d3cd791a9baa16fb461d7ea3de80d019a819cf @@ -670,7 +679,7 @@ F test/badutf2.test f5bc7f2d280670ecd79b9cf4f0f1760c607fe51f F test/bc_common.tcl b5e42d80305be95697e6370e015af571e5333a1c F test/bestindex1.test 852170bddbb21daa121fabcc274640ff83d7d8705912e8b5fe7ed2c5a9a9224a F test/bestindex2.test 9a0ccd320b6525eec3a706aae6cdab7e1b7b5abca75027e39f39f755e76e5928 -F test/bestindex3.test 001788a114ad96d81d5154fe77c7f1e26e84b3a2b5635ca29e4f96f6decc534e +F test/bestindex3.test 7622e792ff2da16d262d3cea6ad914591ac4806d57ed128e6c940b7920b47b84 F test/bestindex4.test 038e3d0789332f3f1d61474f9bbc9c6d08c6bd1783a978f31f38ad82688de601 F test/bestindex5.test 67c1166131bb59f9e47c00118f7d432ca5491e6cae6ca3f87ca9db20103a78f9 F test/bestindex6.test d856a9bb63d927493575823eed44053bc36251e241aa364e54d0f2a2d302e1d4 @@ -693,7 +702,7 @@ F test/boundary3.test 56ef82096b4329aca2be74fa1e2b0f762ea0eb45 F test/boundary4.tcl 0bb4b1a94f4fc5ae59b79b9a2b7a140c405e2983 F test/boundary4.test 89e02fa66397b8a325d5eb102b5806f961f8ec4b F test/btree01.test e08b3613540145b353f20c81cb18ead54ff12e0f -F test/btree02.test a0f33669ba76632247c14718af32db939fa6de5cd13890798ad3f2a362cf7fe4 +F test/btree02.test 7555a5440453d900410160a52554fe6478af4faf53098f7235f1f443d5a1d6cc F test/btreefault.test c2bcb542685eea44621275cfedbd8a13f65201e3 F test/busy.test 510dc6daaad18bcbbc085bcc6217d6dc418def5e73f72ce1475eea0cb7834727 F test/cache.test 13bc046b26210471ca6f2889aceb1ea52dc717de @@ -724,7 +733,7 @@ F test/collateA.test b8218ab90d1fa5c59dcf156efabb1b2599c580d6 F test/collateB.test 1e68906951b846570f29f20102ed91d29e634854ee47454d725f2151ecac0b95 F test/colmeta.test 2c765ea61ee37bc43bbe6d6047f89004e6508eb1 F test/colname.test fb28b3687e03625425bc216edf8b186ce974aa71008e2aa1f426a7dcb75a601d -F test/conflict.test 029faa2d81a0d1cafb5f88614beb663d972c01db +F test/conflict.test c7cc007e2af151516ddf38f7412fe10d473a694f55e3df437e2c7b31c2590e8d F test/conflict2.test bb0b94cf7196c64a3cbd815c66d3ee98c2fecd9c F test/conflict3.test a83db76a6c3503b2fa057c7bfb08c318d8a422202d8bc5b86226e078e5b49ff9 F test/contrib01.test 2a1cbc0f2f48955d7d073f725765da6fbceda6b4 @@ -748,7 +757,8 @@ F test/corruptH.test 79801d97ec5c2f9f3c87739aa1ec2eb786f96454 F test/corruptI.test a17bbf54fdde78d43cf3cc34b0057719fd4a173a3d824285b67dc5257c064c7b F test/corruptJ.test 4d5ccc4bf959464229a836d60142831ef76a5aa4 F test/corruptK.test 5ef338c560ca4dfb7360828da16f1829be4deba3b378cafdc7a1cdaf027eb5c4 -F test/cost.test b37db8a10d467a69e71a9f3d40bbb266c2f587742b37c6912f6e3f7185a0e216 +F test/corruptL.test 0f64242b83db6d0bd5b6e38c205bf7c2a3bc6c9f80351f49c4dee1639aca60d8 +F test/cost.test 51f4fcaae6e78ad5a57096831259ed6c760e2ac6876836e91c00030fad385b34 F test/count.test cb2e0f934c6eb33670044520748d2ecccd46259c F test/countofview.test e3d4cd6900e4e4f074968ab24b8b87d3671cd624961bef40fd3a6b8f574343cf F test/coveridxscan.test 5ec98719a2e2914e8908dc75f7247d9b54a26df04625f846ac7900d5483f7296 @@ -764,7 +774,7 @@ F test/crashM.test d95f59046fa749b0d0822edf18a717788c8f318d F test/crashtest1.c 09c1c7d728ccf4feb9e481671e29dda5669bbcc2 F test/createtab.test b5de160630b209c4b8925bdcbbaf48cc90b67fe8 F test/cse.test 277350a26264495e86b1785f34d2d0c8600e021c -F test/csv01.test 4a92840619ef435b905e6d3f35cd0644df23225d7b7967d7940b40f06d6a90a6 +F test/csv01.test c9c3af0d58c34e9ac970c5875a77939edb958762c8aafb95409e19a3f088b6cd F test/ctime.test 78749e6c9a5f0010d67985be80788f841e3cd2da18114e2ed6010399a7d807f3 F test/cursorhint.test 7bc346788390475e77a345da2b92270d04d35856 F test/cursorhint2.test 6f3aa9cb19e7418967a10ec6905209bcbb5968054da855fc36c8beee9ae9c42f @@ -772,8 +782,9 @@ F test/dataversion1.test 6e5e86ac681f0782e766ebcb56c019ae001522d114e0e111e5ebf68 F test/date.test 9b73bbeb1b82d9c1f44dec5cf563bf7da58d2373 F test/date2.test 74c234bece1b016e94dd4ef9c8cc7a199a8806c0e2291cab7ba64bace6350b10 F test/dbfuzz.c 73047c920d6210e5912c87cdffd9a1c281d4252e +F test/dbfuzz001.test 29b6c6b39a701b6b5b08035c637674b76e1ecea515b1a184b29e3bd0f2d02dad F test/dbfuzz2-seed1.db e6225c6f3d7b63f9c5b6867146a5f329d997ab105bee64644dc2b3a2f2aebaee -F test/dbfuzz2.c 652f85bac1770e927da139db513234a3eba308f72ac2f8b32f0093d7d19def70 +F test/dbfuzz2.c 5d5eb817dc8195e0228227510ee6a4b49f46e679fc2d5be96841cce819bf42f7 F test/dbpage.test 650234ba683b9d82b899c6c51439819787e7609f17a0cc40e0080a7b6443bc38 F test/dbstatus.test cd83aa623b8aab477269bc94cf8aa90c1e195a144561dd04a1620770aaa8524e F test/dbstatus2.test f5fe0afed3fa45e57cfa70d1147606c20d2ba23feac78e9a172f2fe8ab5b78ef @@ -805,7 +816,7 @@ F test/e_fts3.test 17ba7c373aba4d4f5696ba147ee23fd1a1ef70782af050e03e262ca187c5e F test/e_insert.test f02f7f17852b2163732c6611d193f84fc67bc641fb4882c77a464076e5eba80e F test/e_reindex.test 2b0e29344497d9a8a999453a003cb476b6b1d2eef2d6c120f83c2d3a429f3164 F test/e_resolve.test a61751c368b109db73df0f20fc75fb47e166b1d8 -F test/e_select.test c5a669b4d63217aa10094ba737ba3ddd07bd439d4bc7a5b798f6ea32511cbe7c +F test/e_select.test f9474205669a7736ef725b29cc7ae9e8601919a3d0ffc0ab30745a028f2a4b61 F test/e_select2.test aceb80ab927d46fba5ce7586ebabf23e2bb0604f F test/e_totalchanges.test b12ee5809d3e63aeb83238dd501a7bca7fd72c10 F test/e_update.test f46c2554d915c9197548681e8d8c33a267e84528 @@ -820,7 +831,7 @@ F test/enc.test e54531cd6bf941ee6760be041dff19a104c7acea F test/enc2.test 83437a79ba1545a55fb549309175c683fb334473 F test/enc3.test 6807f7a7740a00361ca8d0ccd66bc60c8dc5f2b6 F test/enc4.test c8f1ce3618508fd0909945beb8b8831feef2c020 -F test/eqp.test fc00ad1a7f5b90bf1bbccbf877ae9abef8bf5c7896174830d438c8f91a6ead88 +F test/eqp.test 84879b63e3110552bf8ce648a3507dc3ceb72109ecec83c2aef0db37a27f6382 F test/errmsg.test eae9f091eb39ce7e20305de45d8e5d115b68fa856fba4ea6757b6ca3705ff7f9 F test/eval.test a64c9105d6ff163df7cf09d6ac29cdad5922078c F test/exclusive.test 1206b87e192497d78c7f35552e86a9d05421498da300fb1cce5ca5351ccde3c3 @@ -830,7 +841,7 @@ F test/exists.test 79a75323c78f02bbe9c251ea502a092f9ef63dac F test/expr.test 7cb55e80aeb41d65fec968c08212505123063fea60bdc355d764d747670e9eea F test/extension01.test 00d13cec817f331a687a243e0e5a2d87b0e358c9 F test/extraquick.test cb254400bd42bfb777ff675356aabf3287978f79 -F test/fallocate.test 07416bd593a116d5893cb244f45a94d5c6fe030561df3bd972e6135f8106e509 +F test/fallocate.test 37a62e396a68eeede8f8d2ecf23573a80faceb630788d314d0a073d862616717 F test/filectrl.test 6e871c2d35dead1d9a88e176e8d2ca094fec6bb3 F test/filefmt.test f393e80c4b8d493b7a7f8f3809a8425bbf4292af1f5140f01cb1427798a2bbd4 F test/fkey1.test d11dbb8a93ead9b5c46ae5d02da016d61245d47662fb2d844c99214f6163f768 @@ -840,7 +851,7 @@ F test/fkey4.test 86446017011273aad8f9a99c1a65019e7bd9ca9d F test/fkey5.test 24dd28eb3d9f1b5a174f47e9899ace5facb08373a4223593c8c631e6cf9f7d5a F test/fkey6.test d078a1e323a740062bed38df32b8a736fd320dc0 F test/fkey7.test 24076d43d3449f12f25503909ca4bfb5fc5fefd5af1f930723a496343eb28454 -F test/fkey8.test e5372e32cdb4481f121ec3550703eeb7b4e0762c +F test/fkey8.test 863c6d84f0d289fd2c1a1c293abb9803f77efd35211d9012c0986c8f6ccf5d5a F test/fkey_malloc.test 594a7ea1fbab553c036c70813cd8bd9407d63749 F test/fordelete.test eb93a2f34137bb87bdab88fcab06c0bd92719aff F test/format4.test 1f0cac8ff3895e9359ed87e41aaabee982a812eb @@ -880,8 +891,8 @@ F test/fts2q.test b2fbbe038b7a31a52a6079b215e71226d8c6a682 F test/fts2r.test b154c30b63061d8725e320fba1a39e2201cadd5e F test/fts2token.test d8070b241a15ff13592a9ae4a8b7c171af6f445a F test/fts3.test 672a040ea57036fb4b6fdc09027c18d7d24ab654 -F test/fts3_common.tcl 99cf6659b87c0f74f55963c2aea03b3a7d66ceb0 -F test/fts3aa.test f267fcd6aca30fc70b81e5d82b68b34b38f581896020b57ed49e9777c7ebd85f +F test/fts3_common.tcl dffad248f9ce090800e272017d2898005c28ee6314fc1dd5550643a02666907a +F test/fts3aa.test 814d60a1ba30b4a71d8f9306a6564bc7b636dd6efacd2ad80306f9b23ef3ebee F test/fts3ab.test 7f6cf260ae80dda064023df8e8e503e9a412b91f F test/fts3ac.test 636ed7486043055d4f126a0e385f2d5a82ebbf63 F test/fts3ad.test e40570cb6f74f059129ad48bcef3d7cbc20dda49 @@ -899,7 +910,7 @@ F test/fts3ao.test 266989148fec6d9f1bb6c5382f7aa3dcea0e9cd444576e28dd2b9287ac7dd F test/fts3atoken.test 4b4c16fdcfc972f2cdbba212375a060a86ccf5f1 F test/fts3auto.test 19097050a3ca7ab7a43b2be967cb3dfd8ddf841dfdc4eac88deb172ad2f209f2 F test/fts3aux1.test 7a170e172afdbceb67f5baa05941fd4fbf56af42f61daa3d140f4b4bf4cb68f6 -F test/fts3aux2.test 7ae2b2c13aefdf4169279a27a5f51780ce57f6ba +F test/fts3aux2.test 2459e7fa3e22734aed237d1e2ae192f5541c4d8b218956ad2d90754977bf907f F test/fts3b.test c15c4a9d04e210d0be67e54ce6a87b927168fbf9c1e3faec8c1a732c366fd491 F test/fts3c.test fc723a9cf10b397fdfc2b32e73c53c8b1ec02958 F test/fts3comp1.test a0f5b16a2df44dd0b15751787130af2183167c0c @@ -907,7 +918,7 @@ F test/fts3conf.test c84bbaec81281c1788aa545ac6e78a6bd6cde2bdbbce2da261690e3659f F test/fts3corrupt.test 46b9ddda7f6588fd5a5b1f4bb4fc0618dc45010e7dddb8a3a188baf3197177ae F test/fts3corrupt2.test bf55c3fa0b0dc8ea1c0fe5543623bd27714585da6a129038fd6999fe3b0d25f3 F test/fts3corrupt3.test 0d5b69a0998b4adf868cc301fc78f3d0707745f1d984ce044c205cdb764b491f -F test/fts3corrupt4.test a27259f4f25d60b4eca481d050b3cfee97eddb0d937d38f231408c5239066e11 +F test/fts3corrupt4.test ff7313656c4ad446e61c41e5cb81336441eaaafe6f4fd6938f1c3ac0c985045e F test/fts3cov.test cb932743da52a1c79a1ab8983e26c8121cf02263d6ff16e1f642e6f9b8348338 F test/fts3d.test 2bd8c97bcb9975f2334147173b4872505b6a41359a4f9068960a36afe07a679f F test/fts3defer.test f4c20e4c7153d20a98ee49ee5f3faef624fefc9a067f8d8d629db380c4d9f1de @@ -919,10 +930,11 @@ F test/fts3expr.test ebae205a7a89446c32583bcd492dcb817b9f6b31819bb4dde2583bb99c7 F test/fts3expr2.test 18da930352e5693eaa163a3eacf96233b7290d1a F test/fts3expr3.test c4d4a7d6327418428c96e0a3a1137c251b8dfbf8 F test/fts3expr4.test cac5dd815fe6b5921741abdccdde3b7f50b86394de91e13308ee7986859c4a9f -F test/fts3expr5.test f9abfffbf5e53d48a33e12a1e8f8ba2c551c9b49 -F test/fts3fault.test 9fb7d6266a38806de841f7244bac1b0fe3a1477184bbb10b172d19d2ca6ad692 +F test/fts3expr5.test 1368738e3298a7ce0dee3a44d6ebb8f468b2a76f3d1dd18d4ea6d8bc2eeccc1b +F test/fts3fault.test 798e45af84be7978ca33d5bdc94246eb44724db24174b5d8e9b1ac46c57fb08d F test/fts3fault2.test 6a17a11d8034b1c4eca9f3091649273d56c49ff049e2173df8060f94341e9da0 F test/fts3first.test dbdedd20914c8d539aa3206c9b34a23775644641 +F test/fts3fuzz001.test e3c7b0ce9b04cc02281dcc96812a277f02df03cd7dc082055d87e11eb18aaf56 F test/fts3join.test 949b4f5ae3ae9cc2423cb865d711e32476bdb205ab2be923fdf48246e4a44166 F test/fts3malloc.test b0e4c133b8d61d4f6d112d8110f8320e9e453ef6 F test/fts3matchinfo.test aa66cc50615578b30f6df9984819ae5b702511cf8a94251ec7c594096a703a4a @@ -935,7 +947,7 @@ F test/fts3query.test ca033ff2ebcc22c69d89032fb0bc1850997d31e7e60ecd26440796ba16 F test/fts3rank.test cd99bc83a3c923c8d52afd90d86979cf05fc41849f892faeac3988055ef37b99 F test/fts3rnd.test 1320d8826a845e38a96e769562bf83d7a92a15d0 F test/fts3shared.test 57e26a801f21027b7530da77db54286a6fe4997e -F test/fts3snippet.test 8cf586fe4b6878192602a81a665448aacbbad80ade0867bb5299d40e73584311 +F test/fts3snippet.test dace744104d1a44dc12dc9dd10b8d7542342df503d96942b7c4a55034e761789 F test/fts3sort.test ed34c716a11cc2009a35210e84ad5f9c102362ca F test/fts3tok1.test a663f4cac22a9505400bc22aacb818d7055240409c28729669ea7d4cc2120d15 F test/fts3tok_err.test 52273cd193b9036282f7bacb43da78c6be87418d @@ -956,6 +968,7 @@ F test/fts4merge4.test d895b1057a7798b67e03455d0fa50e9ea836c47b F test/fts4noti.test 5553d7bb2e20bf4a06b23e849352efc022ce6309 F test/fts4onepass.test d69ddc4ee3415e40b0c5d1d0408488a87614d4f63ba9c44f3e52db541d6b7cc7 F test/fts4opt.test 0fd0cc84000743ff2a883b9b84b4a5be07249f0ba790c8848a757164cdd46b2a +F test/fts4umlaut.test fcaca4471de7e78c9d1f7e8976e3e8704d7d8ad979d57a739d00f3f757380429 F test/fts4unicode.test ceca76422abc251818cb25dabe33d3c3970da5f7c90e1540f190824e6b3a7c95 F test/full.test 6b3c8fb43c6beab6b95438c1675374b95fab245d F test/func.test 09dda479bcfc568f99f3070413e9672a8eeedc1be9c5d819bf55d4788c2583b7 @@ -968,16 +981,18 @@ F test/fuzz-oss1.test e58330d01cbbd8215ee636b17a03fe220b37dbfa F test/fuzz.test 96083052bf5765e4518c1ba686ce2bab785670d1 F test/fuzz2.test 76dc35b32b6d6f965259508508abce75a6c4d7e1 F test/fuzz3.test 9c813e6613b837cb7a277b0383cd66bfa07042b4cf0317157c35852f30043c31 +F test/fuzz4.test c229bcdb45518a89e1d208a21343e061503460ac69fae1539320a89f572eb634 F test/fuzz_common.tcl a87dfbb88c2a6b08a38e9a070dabd129e617b45b F test/fuzz_malloc.test f348276e732e814802e39f042b1f6da6362a610af73a528d8f76898fde6b22f2 -F test/fuzzcheck.c fda41c0e4e667fae96b002410bb19cece7a33314264ed6bbc6d012909ee9fd58 +F test/fuzzcheck.c 7ab35ca464fa0fa9c8340b71f08a16c50c14b961264c172cc3d1a67289b2800d F test/fuzzdata1.db 7ee3227bad0e7ccdeb08a9e6822916777073c664 F test/fuzzdata2.db 128b3feeb78918d075c9b14b48610145a0dd4c8d6f1ca7c2870c7e425f5bf31f F test/fuzzdata3.db c6586d3e3cef0fbc18108f9bb649aa77bfc38aba F test/fuzzdata4.db b502c7d5498261715812dd8b3c2005bad08b3a26e6489414bd13926cd3e42ed2 F test/fuzzdata5.db e35f64af17ec48926481cfaf3b3855e436bd40d1cfe2d59a9474cb4b748a52a5 F test/fuzzdata6.db 92a80e4afc172c24f662a10a612d188fb272de4a9bd19e017927c95f737de6d7 -F test/fuzzdata7.db a1bf54eb455e9772942abae1b2d1cf1e3d3659f0e5dd14f00792fd01411ae8ef +F test/fuzzdata7.db 3fc78e65dfe0be9df9e262075d5a335f18f627da47dfc691d1a7b822f34d4b99 +F test/fuzzdata8.db 3f7c67741ba91c13955609700a44608d2dfe4f037e508f77d236ea9abb431a02 F test/fuzzer1.test 3d4c4b7e547aba5e5511a2991e3e3d07166cfbb8 F test/fuzzer2.test a85ef814ce071293bce1ad8dffa217cbbaad4c14 F test/fuzzerfault.test 8792cd77fd5bce765b05d0c8e01b9edcf8af8536 @@ -1013,20 +1028,21 @@ F test/index2.test f835d5e13ca163bd78c4459ca15fd2e4ed487407 F test/index3.test 51685f39345462b84fcf77eb8537af847fdf438cc96b05c45d6aaca4e473ade0 F test/index4.test ab92e736d5946840236cd61ac3191f91a7856bf6 F test/index5.test 8621491915800ec274609e42e02a97d67e9b13e7 -F test/index6.test d07ea75b8c21f125c6f325522e8df8c05c91e9251ec923a31d0582b2ba4a617d +F test/index6.test 6b3e6cd4bef343ed4541e74c55936ed112962a6552c085242612b598e12910a4 F test/index7.test 72b59b8ddc5c13f4962886b4011eb9975014317d17ef36c6297921362fb7dd98 F test/index8.test bc2e3db70e8e62459aaa1bd7e4a9b39664f8f9d7 F test/index9.test 0aa3e509dddf81f93380396e40e9bb386904c1054924ba8fa9bcdfe85a8e7721 F test/indexedby.test a52c8c6abfae4fbfb51d99440de4ca1840dbacc606b05e29328a2a8ba7cd914e F test/indexexpr1.test 635261197bcdc19b9b2c59bbfa7227d525c00e9587faddb2d293c44d287ce60e -F test/indexexpr2.test fc994dcd4b3da932d4add8e65ed7ca08166d541e00a46874cfacd98dfb93a31b +F test/indexexpr2.test 38020c247ee77ba19322fadde99db84bdf2aef34f714866786563c3834bb2dce F test/indexfault.test 31d4ab9a7d2f6e9616933eb079722362a883eb1d F test/init.test 15c823093fdabbf7b531fe22cf037134d09587a7 -F test/insert.test 5604b1ff5675cc84c34a5b315792b958f48c32edccc0dafcc81d3b776270b70a +F test/insert.test 9773604f8e1a2595f51488a5643c359d8a11dc55a11cb185910d93387d378458 F test/insert2.test 4d14b8f1b810a41995f6286b64a6943215d52208 F test/insert3.test 1b7db95a03ad9c5013fdf7d6722b6cd66ee55e30 F test/insert4.test 46bead5f39e181850ee56adcf49d3a3157c460c52249211714612ac89fe34835 F test/insert5.test 394f96728d1258f406fe5f5aeb0aaf29487c39a6 +F test/insertfault.test ac63d14ea3b49c573673a572f4014b9117383a03e497c58f308b5c776e4a7f74 F test/instr.test 9a8802f28437d8ade53fedfc47b2ca599b4e48ba F test/instrfault.test 0f870b218ea17cd477bb19ed330eecdb460dd53a F test/intarray.test 8319986182af37c8eb4879c6bfe9cf0074e9d43b193a4c728a0efa3417c53fb7 @@ -1041,11 +1057,11 @@ F test/ioerr4.test f130fe9e71008577b342b8874d52984bd04ede2c F test/ioerr5.test 2edfa4fb0f896f733071303b42224df8bedd9da4 F test/ioerr6.test a395a6ab144b26a9e3e21059a1ab6a7149cca65b F test/istrue.test 62372ad3ddcc5d0eb8ff9097dcb0aad8961bf1b9cb45ba634f6e284695126f9a -F test/join.test 2ad9d7fe10e0cc06bc7803c22e5533be11cdadbc592f5f95d789a873b57a5a66 +F test/join.test d53a3662762eff50b65da8775201e609878a27dd0885a1ae7bcde9bb46cecbc5 F test/join2.test 10f7047e723ebd68b2f47189be8eed20451a6f665d8bf46f1774c640d1062417 F test/join3.test 6f0c774ff1ba0489e6c88a3e77b9d3528fb4fda0 F test/join4.test 1a352e4e267114444c29266ce79e941af5885916 -F test/join5.test 5a2da0c3ea852a7063d3e72fc7d5a04a6de5ef6e6d85092582f69033f7459adc +F test/join5.test f8b5ffdf3c1513486b52ad4e49225507ecee5005f210eb18688f791d25370972 F test/join6.test cfe6503791ceb0cbb509966740286ec423cbf10b F test/journal1.test c7b768041b7f494471531e17abc2f4f5ebf9e5096984f43ed17c4eb80ba34497 F test/journal2.test 9dac6b4ba0ca79c3b21446bbae993a462c2397c4 @@ -1053,7 +1069,7 @@ F test/journal3.test c9c29883f5bf535ae82ae21c472df6263806a22e467b6db7cd0d6d54530 F test/jrnlmode.test a6693f2bed4541a21e703aaa37bb3e10de154130645952933b82b2dec0a8b539 F test/jrnlmode2.test 8759a1d4657c064637f8b079592651530db738419e1d649c6df7048cd724363d F test/jrnlmode3.test 556b447a05be0e0963f4311e95ab1632b11c9eaa -F test/json101.test b40a9f5395d8e669b0bc3eb550ad2ae9e5ada01fbce23c446c2a30a305a6d575 +F test/json101.test 8f8977b00ba02f9a26c1d1f52f29f540f6d5eb162cbd5eb78bb805366d4ab26d F test/json102.test eeb54efa221e50b74a2d6fb9259963b48d7414dca3ce2fdfdeed45cb28487bc1 F test/json103.test aff6b7a4c17d5a20b487a7bc1a274bfdc63b829413bdfb83bedac42ec7f67e3b F test/json104.test 877d5845f6303899b7889ea5dd1bea99076e3100574d5c536082245c5805dcaa @@ -1076,7 +1092,7 @@ F test/lock4.test 27143363eda1622f03c133efc8db808fc331afd973486cb571ea71cd717d37 F test/lock5.test c6c5e0ebcb21c61a572870cc86c0cb9f14cede38 F test/lock6.test ad5b387a3a8096afd3c68a55b9535056431b0cf5 F test/lock7.test 49f1eaff1cdc491cc5dee3669f3c671d9f172431 -F test/lock_common.tcl 7ffb45accf6ee91c736df9bafe0806a44358f035 +F test/lock_common.tcl 2f3f7f2e9637f93ccf609df48ef5b27a50278b6b1cd752b445d52262e5841413 F test/lookaside.test 5a828e7256f1ee4da8e1bdaa03373a3ccdb0f1ff98dfa82e9b76cb41a45b1083 F test/main.test 6bbb3999fd461eb8fb335cbab97409a3d7f91bbb8da60635e8be3e4a04a77772 F test/make-where7.tcl 05c16b5d4f5d6512881dfec560cb793915932ef9 @@ -1107,7 +1123,7 @@ F test/malloctraceviewer.tcl b7a54595270c1d201abf1c3f3d461f27eaf24cdef623ad08a0f F test/manydb.test 28385ae2087967aa05c38624cec7d96ec74feb3e F test/mem5.test c6460fba403c5703141348cd90de1c294188c68f F test/memdb.test c1f2a343ad14398d5d6debda6ea33e80d0dafcc7 -F test/memdb1.test 61aa1dbdeea6320791d2ff42a9a6149d5716be674bf06ee0ffa0aad1bf3eb5f8 +F test/memdb1.test 0632e6ea56c48e3c6e9b0c73e120310bad8f93762543f809e267888f5a37943f F test/memleak.test 10b9c6c57e19fc68c32941495e9ba1c50123f6e2 F test/memsubsys1.test 9e7555a22173b8f1c96c281ce289b338fcba2abe8b157f8798ca195bbf1d347e F test/memsubsys2.test 3e4a8d0c05fd3e5fa92017c64666730a520c7e08 @@ -1115,13 +1131,13 @@ F test/minmax.test 6751e87b409fe11b02e70a306d846fa544e25a41 F test/minmax2.test dae92964ac87c1d2ef978c582e81a95e11c00f1cbef68980bfb2abaf10315063 F test/minmax3.test cc1e8b010136db0d01a6f2a29ba5a9f321034354 F test/minmax4.test 936941484ebdceb8adec7c86b6cd9b6e5e897c1f -F test/misc1.test c8cfd1c3f842b3341fda9d81a96236d5c76ca89973aeff3fe50bac6fefcfc421 +F test/misc1.test 7ce84b25df9872e7d7878613a96815d2ba5bc974ac4e15a50118dde8f3917599 F test/misc2.test 00d7de54eda90e237fc9a38b9e5ccc769ebf6d4d F test/misc3.test cf3dda47d5dda3e53fc5804a100d3c82be736c9d F test/misc4.test 10cd6addb2fa9093df4751a1b92b50440175dd5468a6ec84d0386e78f087db0e F test/misc5.test c4aeaa0fa28faa08f2485309c38db4719e6cd1364215d5687a5b96d340a3fa58 F test/misc6.test 953cc693924d88e6117aeba16f46f0bf5abede91 -F test/misc7.test 10d639a5e0fdf1bd51ad42be705393a38780ad71b6957110035a4e6c1e5e7f40 +F test/misc7.test 4f21954012e4eb0a923c54a311f38c81bf6798ccdd7b51584db46d4007f63daa F test/misc8.test 8fb0f31d7a8aed484d759773ab8ad12ec746a477f4a67394a4af0e677494c3ca F test/misuse.test 9e7f78402005e833af71dcab32d048003869eca5abcaccc985d4f8dc1d86bcc7 F test/mjournal.test 28a08d5cb5fb5b5702a46e19176e45e964e0800d1f894677169e79f34030e152 @@ -1140,7 +1156,7 @@ F test/mutex2.test bfeaeac2e73095b2ac32285d2756e3a65e681660 F test/nan.test 437d40e6d0778b050d7750726c0cbd2c9936b81962926e8f8c48ca698f00f4d1 F test/nockpt.test 8c43b25af63b0bd620cf1b003529e37b6f1dc53bd22690e96a1bd73f78dde53a F test/nolock.test f196cf8b8fbea4e2ca345140a2b3f3b0da45c76e -F test/normalize.test 6a80564d2000702b5919ed2c1069fef0f95762142bc96a71b4c124a845165713 +F test/normalize.test 422027884ffb67ebba32bb78487c67cf67643496d19c077b07044bdba071a3f6 F test/notify1.test 669b2b743618efdc18ca4b02f45423d5d2304abf F test/notify2.test 2ecabaa1305083856b7c39cf32816b612740c161 F test/notify3.test 10ff25cde502e72a92053a2f215d64bece4ef934 @@ -1163,7 +1179,7 @@ F test/orderby7.test 3d1383d52ade5b9eb3a173b3147fdd296f0202da F test/orderby8.test 23ef1a5d72bd3adcc2f65561c654295d1b8047bd F test/orderby9.test 87fb9548debcc2cd141c5299002dd94672fa76a3 F test/oserror.test e7b3416be4b9d5dd2fe0b42dd394daaddbb6c83eeec1f0e47b120b53e0ad3ace -F test/ossfuzz.c 273eaea2d65b70d77ea4f01404114b9e0244488943f768dc39458c72bd722e0e +F test/ossfuzz.c 18af635fa73d12a109b305faca727a734c1fa28a421b161d9d15c5a84a4998a2 F test/ossshell.c f125c5bd16e537a2549aa579b328dd1c59905e7ab1338dfc210e755bb7b69f17 F test/ovfl.test 199c482696defceacee8c8e0e0ef36da62726b2f F test/pager1.test 1e9ee778bdeaf4f7f09997d029cdaca6a42dfc2092edafe4f5e590acbf1eab13 @@ -1179,7 +1195,7 @@ F test/parser1.test 6ccdf5e459a5dc4673d3273dc311a7e9742ca952dd0551a6a6320d27035c F test/pcache.test c8acbedd3b6fd0f9a7ca887a83b11d24a007972b F test/pcache2.test af7f3deb1a819f77a6d0d81534e97d1cf62cd442 F test/percentile.test 4243af26b8f3f4555abe166f723715a1f74c77ff -F test/permutations.test cf0b4e498db1d0143c19641d4420df7cc27fab2c95ed0abd2c7c5753beab25b8 +F test/permutations.test 52d2c37fe8cc07ec7362024c214b04bb69432995b3a984a3fbabc60fa6ada3ee F test/pg_common.tcl 301ac19c1a52fd55166d26db929b3b89165c634d52b5f8ad76ea8cb06960db30 F test/pragma.test c267bf02742c823a191960895b3d52933cebd7beee26757d1ed694f213fcd867 F test/pragma2.test e5d5c176360c321344249354c0c16aec46214c9f @@ -1187,6 +1203,7 @@ F test/pragma3.test 8300aa9c63cff1027006ca34bf413a148abbd6dcd471fa9a1ded322fe18c F test/pragma4.test 52d8186f9e8d09b87189432cdd401dfa66d0b32445e837fa19046c8ae7621b0e F test/pragma5.test 824ce6ced5d6b7ec71abe37fc6005ff836fe39d638273dc5192b39864b9ee983 F test/pragmafault.test 275edaf3161771d37de60e5c2b412627ac94cef11739236bec12ed1258b240f8 +F test/prefixes.test b524a1c44bffec225b9aec98bd728480352aa8532ac4c15771fb85e8beef65d9 F test/printf.test a3e559bc9d922e7fe44e9d05c6965fee34fe3bc28300a4248c6a063425246ffd F test/printf2.test 30b5dd0b4b992dc5626496846ecce17ff592cacbcb11c3e589f3ac4d7e129dae F test/progress.test ebab27f670bd0d4eb9d20d49cef96e68141d92fb @@ -1205,8 +1222,8 @@ F test/rdonly.test 64e2696c322e3538df0b1ed624e21f9a23ed9ff8 F test/regexp1.test 497ea812f264d12b6198d6e50a76be4a1973a9d8 F test/regexp2.test 40e894223b3d6672655481493f1be12012f2b33c F test/reindex.test 44edd3966b474468b823d481eafef0c305022254 -F test/releasetest.tcl b290d538ffcb2ff711f09eadc7396c1a42580f3fb078605471dc8875ca0b4d1e x -F test/resetdb.test 373a9eb8fcbd58bf87affec6a88c6353038f98a5d25be5ab75a0b9636c462a36 +F test/releasetest.tcl 7712811e0f4e2f198ec786cb2e1352b3793d7395f48a3cceef0572d8823eb75e x +F test/resetdb.test 8062cf10a09d8c048f8de7711e94571c38b38168db0e5877ba7561789e5eeb2b F test/resolver01.test f4022acafda7f4d40eca94dbf16bc5fc4ac30ceb F test/rollback.test 06680159bc6746d0f26276e339e3ae2f951c64812468308838e0a3362d911eaa F test/rollback2.test bc868d57899dc6972e2b4483faae0e03365a0556941474eec487ae21d8d38bb6 @@ -1217,7 +1234,7 @@ F test/rowid.test 5b7509f384f4f6fae1af3c8c104c8ca299fea18d F test/rowvalue.test b8680f07d19c8c5223b808bba998faffcec6d505f5689ff6070280119173bb51 F test/rowvalue2.test 060d238b7e5639a7c5630cb5e63e311b44efef2b F test/rowvalue3.test 3068f508753af69884b12125995f023da0dbb256 -F test/rowvalue4.test 2b20468da3775aba971caf3158e9696a4d99c69a7623fb495f332a596daebbee +F test/rowvalue4.test 02e35f7762371c2f57ebd856aa056eac56cb27ef7715a0bb31eac1895a745356 F test/rowvalue5.test c81c7d8cf36711ab37675ad7376084ae2a359cb6 F test/rowvalue6.test d19b54feb604d5601f8614b15e214e0774c01087 F test/rowvalue7.test 5d06ff19d9e6969e574a2e662a531dd0c67801a8 @@ -1243,7 +1260,7 @@ F test/schema6.test e4bd1f23d368695eb9e7b51ef6e02ca0642ea2ab4a52579959826b5e7dce F test/schemafault.test 1936bceca55ac82c5efbcc9fc91a1933e45c8d1e1d106b9a7e56c972a5a2a51e F test/securedel.test 2f70b2449186a1921bd01ec9da407fbfa98c3a7a5521854c300c194b2ff09384 F test/securedel2.test 2d54c28e46eb1fd6902089958b20b1b056c6f1c5 -F test/select1.test 2e760bab8f3658b3b97debcf52860d0d2e20aa6cbe8b40e678ddb99871a15491 +F test/select1.test 7d41f354998524070317207d4e2b68e725e4cf14a57835fc746d4bea686a8714 F test/select2.test 352480e0e9c66eda9c3044e412abdf5be0215b56 F test/select3.test 2ce595f8fb8e2ac10071d3b4e424cadd4634a054 F test/select4.test 5389d9895968d1196c457d59b3ee6515d771d328 @@ -1275,14 +1292,15 @@ F test/sharedA.test 49d87ec54ab640fbbc3786ee3c01de94aaa482a3a9f834ad3fe92770eb69 F test/sharedB.test 16cc7178e20965d75278f410943109b77b2e645e F test/shared_err.test 32634e404a3317eeb94abc7a099c556a346fdb8fb3858dbe222a4cbb8926a939 F test/sharedlock.test 5ede3c37439067c43b0198f580fd374ebf15d304 -F test/shell1.test d2bf5daeb6f449f0169c9ef3094db17a16a02199c5dcf1a635a3e79b07eb0edd +F test/shell1.test 0378c4e9e800da6fbb3c86c0c8f2cf5efc9e4155b4b6447d27dc71de648fc0a1 F test/shell2.test e242a9912f44f4c23c3d1d802a83e934e84c853b F test/shell3.test ac8c2b744014c3e9a0e26bfd829ab65f00923dc1a91ffd044863e9423cc91494 -F test/shell4.test 89ad573879a745974ff2df20ff97c5d6ffffbd5d +F test/shell4.test 1c6aef11daaa2d6830acaba3ac9cbec93fbc1c3d5530743a637f39b3987d08ce F test/shell5.test 23939a4c51f0421330ea61dbd3c74f9c215f5f8d3d1a94846da6ffc777a35458 F test/shell6.test 1ceb51b2678c472ba6cf1e5da96679ce8347889fe2c3bf93a0e0fa73f00b00d3 F test/shell7.test 115132f66d0463417f408562cc2cf534f6bbc6d83a6d50f0072a9eb171bae97f F test/shell8.test 96be02ea0c21f05b24c1883d7b711a1fa8525a68ab7b636aacf6057876941013 +F test/shmlock.test 3dbf017d34ab0c60abe6a44e447d3552154bd0c87b41eaf5ceacd408dd13fda5 F test/shortread1.test bb591ef20f0fd9ed26d0d12e80eee6d7ac8897a3 F test/show_speedtest1_rtree.tcl 32e6c5f073d7426148a6936a0408f4b5b169aba5 F test/shrink.test 1b4330b1fd9e818c04726d45cb28db73087535ce @@ -1296,7 +1314,7 @@ F test/snapshot.test a504f2e7009f512ef66c719f0ea1c55a556bdaf1e1312c80a04d46fc1a3 F test/snapshot2.test 8d6ff5dd9cc503f6e12d408a30409c3f9c653507b24408d9cd7195931c89bc54 F test/snapshot3.test 8744313270c55f6e18574283553d3c5c5fe4c5970585663613a0e75c151e599b F test/snapshot4.test d4e9347ef2fcabc491fc893506c7bbaf334da3be111d6eb4f3a97cc623b78322 -F test/snapshot_fault.test 508ae6f211d4991e9ff3b5080aeb0a179bf6755138aabeac4bca8083044d895a +F test/snapshot_fault.test f6c5ef7cb93bf92fbb4e864ecc5c87df7d3a250064838822db5b4d3a5563ede4 F test/snapshot_up.test a0a29c4cf33475fcef07c3f8e64af795e24ab91b4cc68295863402a393cdd41c F test/soak.test 18944cf21b94a7fe0df02016a6ee1e9632bc4e8d095a0cb49d95e15d5cca2d5c F test/softheap1.test 843cd84db9891b2d01b9ab64cef3e9020f98d087 @@ -1343,7 +1361,7 @@ F test/sync.test 89539f4973c010eda5638407e71ca7fddbcd8e0594f4c9980229f804d433309 F test/sync2.test 8f9f7d4f6d5be8ca8941a8dadcc4299e558cb6a1ff653a9469146c7a76ef2039 F test/syscall.test a39d9a36f852ae6e4800f861bc2f2e83f68bbc2112d9399931ecfadeabd2d69d F test/sysfault.test c9f2b0d8d677558f74de750c75e12a5454719d04 -F test/tabfunc01.test 54300134f76db817685194d2f0e63e3fbf7380b45e0d426e00a9aee752497cfb +F test/tabfunc01.test 20e98ffe55f35d8d33fd834ca8bf9d4b637e560af8fcd00464b4154d90a4db45 F test/table.test eb3463b7add9f16a5bb836badf118cf391b809d09fdccd1f79684600d07ec132 F test/tableapi.test ecbcc29c4ab62c1912c3717c48ea5c5e59f7d64e4a91034e6148bd2b82f177f4 F test/tableopts.test dba698ba97251017b7c80d738c198d39ab747930 @@ -1355,7 +1373,7 @@ F test/temptable.test d2c9b87a54147161bcd1822e30c1d1cd891e5b30 F test/temptable2.test d2940417496e2b9548e01d09990763fbe88c316504033256d51493e1f1a5ce6a F test/temptable3.test d11a0974e52b347e45ee54ef1923c91ed91e4637 F test/temptrigger.test 38f0ca479b1822d3117069e014daabcaacefffcc -F test/tester.tcl fa5656391e3b477508abe12b3b81f019b2e71397399ab38a2f32d8d7f3bf8e56 +F test/tester.tcl 499a5086815aa416d971ff438d7425c64f41ed3233251db4836d270f9a6671e8 F test/thread001.test b61a29dd87cf669f5f6ac96124a7c97d71b0c80d9012746072055877055cf9ef F test/thread002.test e630504f8a06c00bf8bbe68528774dd96aeb2e58 F test/thread003.test ee4c9efc3b86a6a2767516a37bd64251272560a7 @@ -1530,10 +1548,10 @@ F test/trigger8.test 30cb0530bd7c4728055420e3f739aa00412eafa4 F test/trigger9.test 2226ec795a33b0460ab5cf8891e9054cc7edef41 F test/triggerA.test 837be862d8721f903dba3f3ceff05b32e0bee5214cf6ea3da5fadf12d3650e9d F test/triggerB.test 56780c031b454abac2340dbb3b71ac5c56c3d7fe -F test/triggerC.test 302d8995f5ffe63bbc15053abb3ef7a39cf5a092 +F test/triggerC.test c7fbc3eb241b5a7ba4b0815f76c3708483e91890f9573add12a610c45b2a6022 F test/triggerD.test 8e7f3921a92a5797d472732108109e44575fa650 F test/triggerE.test ede2e4bce4ba802337bd69d39447fa04a938e06d84a8bfc53c76850fc36ed86d -F test/triggerF.test 6a8c22bd058cf467f0c7d112afe87f7a8c579c0c4681b914b8f19020f48528a4 +F test/triggerF.test 5d76f0a8c428ff87a4d5ed52da06f6096a2c787a1e21b846111dfac4123de3ad F test/triggerG.test d5caeef6144ede2426dd13211fd72248241ff2ebc68e12a4c0bf30f5faa21499 F test/tt3_checkpoint.c 9e75cf7c1c364f52e1c47fd0f14c4340a9db0fe1 F test/tt3_index.c 39eec10a35f57672225be4d182862152896dee4a @@ -1543,14 +1561,14 @@ F test/tt3_vacuum.c 1753f45917699c9c1f66b64c717a717c9379f776 F test/types.test bf816ce73c7dfcfe26b700c19f97ef4050d194ff F test/types2.test 1aeb81976841a91eef292723649b5c4fe3bc3cac F test/types3.test 99e009491a54f4dc02c06bdbc0c5eea56ae3e25a -F test/unionvtab.test 5ae0f0b4f302a4c6bb310b64386f9ac6a4c1c271c08f31cc7c5d92722e2b2729 +F test/unionvtab.test e1704ab1b4c1bb3ffc9da4681f8e85a0b909fd80b937984fc94b27415ac8e5a4 F test/unionvtabfault.test e8759f3d14fb938ce9657e2342db34aeac0fb9bc1692b0d1ebb0069630151d06 F test/unique.test 93f8b2ef5ea51b9495f8d6493429b1fd0f465264 F test/unique2.test 3674e9f2a3f1fbbfd4772ac74b7a97090d0f77d2 F test/unixexcl.test d936ba2b06794018e136418addd59a2354eeae97 F test/unordered.test ffeea7747d5ba962a8009a20b7e53d68cbae05b063604c68702c5998eb50c981 F test/update.test 1148de8d913e9817717990603aadeca07aab9ddbb10a30f167cbfd8d3a3ccb60 -F test/update2.test 5e67667e1c54017d964e626db765cf8bedcf87483c184f4c575bdb8c1dd2313e +F test/update2.test 67455bc61fcbcf96923c45b3bc4f87bc72be7d67575ad35f134906148c7b06d3 F test/upsert1.test 994bde41800bb77dbe32fcd2e1f6c4b49cc9f2c6cd345731c774dff02b51c110 F test/upsert2.test 9c3cdbb1a890227f6504ce4b0e3de68f4cdfa16bb21d8641208a9239896c5a09 F test/upsert3.test 88d7d590a1948a9cb6eac1b54b0642f67a9f35a1fc0f19b200e97d5d39e3179c @@ -1560,6 +1578,7 @@ F test/uri.test 3481026f00ade6dfe8adb7acb6e1e47b04369568 F test/uri2.test 9d3ba7a53ee167572d53a298ee4a5d38ec4a8fb7 F test/userauth01.test e740a2697a7b40d7c5003a7d7edaee16acd349a9 F test/utf16align.test 54cd35a27c005a9b6e7815d887718780b6a462ae +F test/vacuum-into.test 41d84c0603f3e8f3540321e5974d69008c562238c30924a9390c211a8c0a415e F test/vacuum.test ce91c39f7f91a4273bf620efad21086b5aa6ef1d F test/vacuum2.test aa048abee196c16c9ba308465494009057b79f9b F test/vacuum3.test 77ecdd54592b45a0bcb133339f99f1ae0ae94d0d @@ -1590,7 +1609,8 @@ F test/vtabJ.test d7b73675708cf63cfcb9d443bb451fc01a028347275b7311e51f9fdf3ca675 F test/vtab_alter.test 736e66fb5ec7b4fee58229aa3ada2f27ec58bc58c00edae4836890c3784c6783 F test/vtab_err.test dcc8b7b9cb67522b3fe7a272c73856829dae4ab7fdb30399aea1b6981bda2b65 F test/vtab_shared.test 5253bff2355a9a3f014c15337da7e177ab0ef8ad -F test/wal.test 613efec03e517e1775d86b993a54877d2e29a477 +F test/vtabdrop.test 65d4cf6722972e5499bdaf0c0d70ee3b8133944a4e4bc31862563f32a7edca12 +F test/wal.test cdf0ca6cc0447520d19ef1c83287824ebeb3e82d75af856511ba96841a79fc9b F test/wal2.test 155b9efa999bdb38ce1cd729b9a4fcdbffd6b88be27f039bad1d2929d287d918 F test/wal3.test 2a93004bc0fb2b5c29888964024695bade278ab2 F test/wal4.test 4744e155cd6299c6bd99d3eab1c82f77db9cdb3c @@ -1610,6 +1630,7 @@ F test/walcrash2.test a0edab4e5390f03b99a790de89aad15d6ec70b36 F test/walcrash3.test e426aa58122d20f2b9fbe9a507f9eb8cab85b8af F test/walcrash4.test e7b6e7639a950a0cca8e210e248c8dad4d63bf20 F test/walfault.test 09b8ad7e52d2f54bce50e31aa7ea51412bb9f70ac13c74e669ddcd8b48b0d98d +F test/walfault2.test e039ac66c78d5561683cacde04097213cdad3b58e2b3f3fe1112862217bfd915 F test/walhook.test ed00a40ba7255da22d6b66433ab61fab16a63483 F test/walmode.test cd6e7cff618eaaa5910ce57c3657aa50110397f86213886a2400afb9bfec7b7b F test/walnoshm.test 84ca10c544632a756467336b7c3b864d493ee496 @@ -1623,15 +1644,16 @@ F test/walrofault.test c70cb6e308c443867701856cce92ad8288cd99488fa52afab77cca6cf F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 +F test/walvfs.test c0faffda13d045a96dfc541347886bb1a3d6f3205857fc98e683edfab766ea88 F test/where.test 8215d220633f08da331781cf9ede7fb7aed50eb113473c10acd39a643fd258ba F test/where2.test 478d2170637b9211f593120648858593bf2445a1 F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 F test/where5.test fdf66f96d29a064b63eb543e28da4dfdccd81ad2 F test/where6.test 5da5a98cec820d488e82708301b96cb8c18a258b -F test/where7.test e579da972eb3372edc9de850efc221848c763f9e4feafc8426d84a4453b92b23 +F test/where7.test 75722434c486ac9e74718caa6cce234f45ba34c0b6c0f9555b29eb8bb5f6ade1 F test/where8.test 461ca40265ed996a6305da99bb024b0e41602bb586acf544c08f95922358e49f -F test/where9.test ad2ddb339d10d324763c3da60502b8631f15a2397b869192fbd4e82f40e167d3 +F test/where9.test 4fb43ad451758d9535693e110d4398fb6a6e3e153dc57bba5e61f884566c725f F test/whereA.test 6c6a420ca7d313242f9b1bd471dc80e4d0f8323700ba9c78df0bb843d4daa3b4 F test/whereB.test 0def95db3bdec220a731c7e4bec5930327c1d8c5 F test/whereC.test cae295158703cb3fc23bf1a108a9ab730efff0f6 @@ -1640,7 +1662,7 @@ F test/whereE.test b3a055eef928c992b0a33198a7b8dc10eea5ad2f F test/whereF.test 3d9412b1199d3e2bed34fcb76b4c48d0bf4df95d27e3f8dd27b6f8b4716d0d89 F test/whereG.test 0158783235a6dd82fc0e37652b8522b186b9510594ac0a4bff0c4101b4396a52 F test/whereH.test e4b07f7a3c2f5d31195cd33710054c78667573b2 -F test/whereI.test b7769ee8dbefd987fb266715fee887f05f9ff180016b06fca7fa402df739193b +F test/whereI.test a2874062140ed4aba9ffae76e6190a3df6fc73d1373fdfa8fd632945082a5364 F test/whereJ.test 88287550f6ee604422403b053455b1ad894eeaa5c35d348532dfa1439286cb9a F test/whereK.test f8e3cf26a8513ecc7f514f54df9f0572c046c42b F test/whereL.test 0a19fc44cd1122040f56c934f1b14d0ca85bde28f270268a428dd9796ea0634c @@ -1653,7 +1675,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 02e481ac48c445b43bab7b3cf1e4115165b5127a1aa29e14f5372922c836f1a4 +F test/window1.test 2798c8249e0f122c9bacce6aa7324765a5cd9106e49e7aacc81f6033d281577b F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143 F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823 @@ -1663,9 +1685,9 @@ F test/window4.test c5d6bf3403e4ade2f19df2afe4c16f29fb817c392c6c1c8017edb7165c19 F test/window5.test d328dd18221217c49c144181975eea17339eaeaf0e9aa558cee3afb84652821e F test/window6.test 5eae4ae7a590ccf1e605880969ca0bad3955616ac91cad3031baea38748badb3 F test/windowfault.test 12ceb6bbb355d13e8fcd88c5731a57256dfdf77b9a7ae20842a76fcd4623df5b -F test/with1.test 2465d98ffce80d00553ac7135697c18b0369275b6ecc750daa2af320b8c812ca +F test/with1.test a07b5aad7f77acdf13e52e8814ea94606fcc72e9ea4c99baf293e9d7c63940be F test/with2.test e0030e2f0267a910d6c0e4f46f2dfe941c1cc0d4f659ba69b3597728e7e8f1ab -F test/with3.test 5e8ce2c585170bbbc0544e2a01a4941fa0be173ba5265e5c92eb588cd99a232d +F test/with3.test 8d26920c88283e0a473ceebd3451554922108ce7b2a6a1157c47eb0a7011212c F test/with4.test 257be66c0c67fee1defbbac0f685c3465e2cad037f21ce65f23f86084f198205 F test/withM.test 693b61765f2b387b5e3e24a4536e2e82de15ff64 F test/without_rowid1.test 533add9100255e4cc430d371b3ecfb79f11f956b86c3a1b9d34413bf8e482d8f @@ -1676,7 +1698,7 @@ F test/without_rowid5.test 89b1c587bd92a0590e440da33e7666bf4891572a F test/without_rowid6.test 1f99644e6508447fb050f73697350c7ceca3392e F test/wordcount.c d721a4b6fae93e6e33449700bce1686bc23257c27425bc3ef1599dc912adec66 F test/writecrash.test f1da7f7adfe8d7f09ea79b42e5ca6dcc41102f27f8e334ad71539501ddd910cc -F test/zeroblob.test 3857870fe681b8185654414a9bccfde80b62a0fa +F test/zeroblob.test 07a5b11ab591d1f26c626945fb7f228f68b993533b2ada77273edf6ee29db174 F test/zerodamage.test 9c41628db7e8d9e8a0181e59ea5f189df311a9f6ce99cc376dc461f66db6f8dc F test/zipfile.test b3b558639f7a103e095713ad0f57fec1fce1b7d60c8054df5789b98f7547a395 F test/zipfile2.test 9903388a602a3834189857a985106ff95c3bba6a3969e0134127df991889db5d @@ -1690,6 +1712,8 @@ F tool/build-shell.sh 950f47c6174f1eea171319438b93ba67ff5bf367 F tool/cg_anno.tcl f95b0006c52cf7f0496b506343415b6ee3cdcdd3 x F tool/checkSpacing.c 810e51703529a204fc4e1eb060e9ab663e3c06d2 F tool/dbhash.c a06228aa21ebc4e6ea8daa486601d938499238a5 +F tool/dbtotxt.c 04e25f26be7c7743cdfb4111a8483de0b111925d6afeeb7559ade0ceb73f7f52 +F tool/dbtotxt.md c9a57af8739957ef36d2cfad5c4b1443ff3688ed33e4901ee200c8b651f43f3c F tool/extract.c 054069d81b095fbdc189a6f5d4466e40380505e2 F tool/fast_vacuum.c 5ba0d6f5963a0a63bdc42840f678bad75b2ebce1 F tool/fragck.tcl 5265a95126abcf6ab357f7efa544787e5963f439 @@ -1697,9 +1721,10 @@ F tool/fuzzershell.c e1d90a03ca790d7c331c2aae08ca46ff435f1ae1faa6cb9cc48f4687c18 F tool/genfkey.README cf68fddd4643bbe3ff8e31b8b6d8b0a1b85e20f4 F tool/genfkey.test b6afd7b825d797a1e1274f519ab5695373552ecad5cd373530c63533638a5a4f F tool/getlock.c f4c39b651370156cae979501a7b156bdba50e7ce +F tool/index_usage.c 9ec344d29cbeb03fdc0fce668eedfb7495792170de933adf95cf8d6904a166ad F tool/kvtest-speed.sh 4761a9c4b3530907562314d7757995787f7aef8f -F tool/lemon.c 60d1e1eb0f7ebae709f68f1472d77fbf291c5345cd98ff417219da7e74fd09e9 -F tool/lempar.c 452f12d40229847634a160e5666b6c4ec4392fd81941c3443861b48d497054cc +F tool/lemon.c 900a15b9efba9890d10e7959914db94c4ad5162912127f061c4328add122d6fb +F tool/lempar.c 61af95b8fac2bfd59c09d55330e78f3f5e352d7aa80bf37404b96ef795be3fdc F tool/libvers.c caafc3b689638a1d88d44bc5f526c2278760d9b9 F tool/loadfts.c c3c64e4d5e90e8ba41159232c2189dba4be7b862 F tool/logest.c 11346aa019e2e77a00902aa7d0cabd27bd2e8cca @@ -1712,7 +1737,7 @@ F tool/mkmsvcmin.tcl cad0c7b54d7dd92bc87d59f36d4cc4f070eb2e625f14159dc2f5c4204e6 F tool/mkopcodec.tcl d1b6362bd3aa80d5520d4d6f3765badf01f6c43c F tool/mkopcodeh.tcl 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21 F tool/mkopts.tcl 680f785fdb09729fd9ac50632413da4eadbdf9071535e3f26d03795828ab07fa -F tool/mkpragmatab.tcl a1334e70a08fdf5de32cd0093613212bb11ac8f880487540987175c536ac335f +F tool/mkpragmatab.tcl 49039adedafbc430d2959400da2e0e8f20ef8dcf6898e447c946e7d50ef5906b F tool/mkshellc.tcl 1f45770aea226ac093a9c72f718efbb88a2a2833409ec2e1c4cecae4202626f5 F tool/mksourceid.c d458f9004c837bee87a6382228ac20d3eae3c49ea3b0a5aace936f8b60748d3b F tool/mkspeedsql.tcl a1a334d288f7adfe6e996f2e712becf076745c97 @@ -1779,11 +1804,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P 23684cb841ac2cb0d69e5470253bd96feb733762a7553b952a08470834fe85fa -R dcc394af10af6094607f56a6086fb748 +P d5d944d7947d7b44ba9a1c844418af49c5f39dbe84f181af790bb1412daed578 +R 2251df76230cd55e64293ef8a825ebab T +bgcolor * #d0c0ff T +sym-release * -T +sym-version-3.26.0 * +T +sym-version-3.27.1 * U drh -Z 560a5decbb241d53eb97e72267b6e6e8 +Z 4aa002629995b65b1d5f498ebad69e25 # Remove this line to create a well-formed manifest. diff --git a/manifest.uuid b/manifest.uuid index 166b1b3..68364f7 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -bf8c1b2b7a5960c282e543b9c293686dccff272512d08865f4600fb58238b4f9 +0eca3dd3d38b31c92b49ca2d311128b74584714d9e7de895b1a6286ef959a1dd diff --git a/src/alter.c b/src/alter.c index 1280e90..e186338 100644 --- a/src/alter.c +++ b/src/alter.c @@ -28,9 +28,16 @@ ** ** Or, if zName is not a system table, zero is returned. */ -static int isSystemTable(Parse *pParse, const char *zName){ - if( 0==sqlite3StrNICmp(zName, "sqlite_", 7) ){ - sqlite3ErrorMsg(pParse, "table %s may not be altered", zName); +static int isAlterableTable(Parse *pParse, Table *pTab){ + if( 0==sqlite3StrNICmp(pTab->zName, "sqlite_", 7) +#ifndef SQLITE_OMIT_VIRTUALTABLE + || ( (pTab->tabFlags & TF_Shadow) + && (pParse->db->flags & SQLITE_Defensive) + && pParse->db->nVdbeExec==0 + ) +#endif + ){ + sqlite3ErrorMsg(pParse, "table %s may not be altered", pTab->zName); return 1; } return 0; @@ -126,7 +133,7 @@ void sqlite3AlterRenameTable( /* Make sure it is not a system table being altered, or a reserved name ** that the table is being renamed to. */ - if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){ + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ goto exit_rename_table; } if( SQLITE_OK!=sqlite3CheckObjectName(pParse, zName) ){ goto @@ -424,7 +431,7 @@ void sqlite3AlterBeginAddColumn(Parse *pParse, SrcList *pSrc){ sqlite3ErrorMsg(pParse, "Cannot add a column to a view"); goto exit_begin_add_column; } - if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ){ + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ){ goto exit_begin_add_column; } @@ -526,7 +533,7 @@ void sqlite3AlterRenameColumn( if( !pTab ) goto exit_rename_column; /* Cannot alter a system table */ - if( SQLITE_OK!=isSystemTable(pParse, pTab->zName) ) goto exit_rename_column; + if( SQLITE_OK!=isAlterableTable(pParse, pTab) ) goto exit_rename_column; if( SQLITE_OK!=isRealTable(pParse, pTab) ) goto exit_rename_column; /* Which schema holds the table to be altered */ @@ -780,14 +787,31 @@ static void renameTokenFind(Parse *pParse, struct RenameCtx *pCtx, void *pPtr){ } } +/* +** Iterate through the Select objects that are part of WITH clauses attached +** to select statement pSelect. +*/ +static void renameWalkWith(Walker *pWalker, Select *pSelect){ + if( pSelect->pWith ){ + int i; + for(i=0; ipWith->nCte; i++){ + Select *p = pSelect->pWith->a[i].pSelect; + NameContext sNC; + memset(&sNC, 0, sizeof(sNC)); + sNC.pParse = pWalker->pParse; + sqlite3SelectPrep(sNC.pParse, p, &sNC); + sqlite3WalkSelect(pWalker, p); + } + } +} + /* ** This is a Walker select callback. It does nothing. It is only required ** because without a dummy callback, sqlite3WalkExpr() and similar do not ** descend into sub-select statements. */ static int renameColumnSelectCb(Walker *pWalker, Select *p){ - UNUSED_PARAMETER(pWalker); - UNUSED_PARAMETER(p); + renameWalkWith(pWalker, p); return WRC_Continue; } @@ -937,7 +961,6 @@ static int renameParseSql( rc = sqlite3RunParser(p, zSql, &zErr); assert( p->zErrMsg==0 ); assert( rc!=SQLITE_OK || zErr==0 ); - assert( (0!=p->pNewTable) + (0!=p->pNewIndex) + (0!=p->pNewTrigger)<2 ); p->zErrMsg = zErr; if( db->mallocFailed ) rc = SQLITE_NOMEM; if( rc==SQLITE_OK @@ -1120,6 +1143,7 @@ static int renameResolveTrigger(Parse *pParse, const char *zDb){ } sNC.ncFlags = 0; } + sNC.pSrcList = 0; } } } @@ -1157,11 +1181,15 @@ static void renameWalkTrigger(Walker *pWalker, Trigger *pTrigger){ */ static void renameParseCleanup(Parse *pParse){ sqlite3 *db = pParse->db; + Index *pIdx; if( pParse->pVdbe ){ sqlite3VdbeFinalize(pParse->pVdbe); } sqlite3DeleteTable(db, pParse->pNewTable); - if( pParse->pNewIndex ) sqlite3FreeIndex(db, pParse->pNewIndex); + while( (pIdx = pParse->pNewIndex)!=0 ){ + pParse->pNewIndex = pIdx->pNext; + sqlite3FreeIndex(db, pIdx); + } sqlite3DeleteTrigger(db, pParse->pNewTrigger); sqlite3DbFree(db, pParse->zErrMsg); renameTokenFree(db, pParse->pRename); @@ -1272,6 +1300,9 @@ static void renameColumnFunc( for(pIdx=sParse.pNewTable->pIndex; pIdx; pIdx=pIdx->pNext){ sqlite3WalkExprList(&sWalker, pIdx->aColExpr); } + for(pIdx=sParse.pNewIndex; pIdx; pIdx=pIdx->pNext){ + sqlite3WalkExprList(&sWalker, pIdx->aColExpr); + } } for(pFKey=sParse.pNewTable->pFKey; pFKey; pFKey=pFKey->pNextFrom){ @@ -1358,12 +1389,17 @@ static int renameTableSelectCb(Walker *pWalker, Select *pSelect){ int i; RenameCtx *p = pWalker->u.pRename; SrcList *pSrc = pSelect->pSrc; + if( pSrc==0 ){ + assert( pWalker->pParse->db->mallocFailed ); + return WRC_Abort; + } for(i=0; inSrc; i++){ struct SrcList_item *pItem = &pSrc->a[i]; if( pItem->pTab==p->pTab ){ renameTokenFind(pWalker->pParse, p, pItem->zName); } } + renameWalkWith(pWalker, pSelect); return WRC_Continue; } diff --git a/src/analyze.c b/src/analyze.c index 5075b57..e6b27aa 100644 --- a/src/analyze.c +++ b/src/analyze.c @@ -1156,7 +1156,7 @@ static void analyzeOneTable( addrNextRow = sqlite3VdbeCurrentAddr(v); if( nColTest>0 ){ - int endDistinctTest = sqlite3VdbeMakeLabel(v); + int endDistinctTest = sqlite3VdbeMakeLabel(pParse); int *aGotoChng; /* Array of jump instruction addresses */ aGotoChng = sqlite3DbMallocRawNN(db, sizeof(int)*nColTest); if( aGotoChng==0 ) continue; diff --git a/src/attach.c b/src/attach.c index 0b87d24..224d120 100644 --- a/src/attach.c +++ b/src/attach.c @@ -155,8 +155,8 @@ static void attachFunc( assert( pVfs ); flags |= SQLITE_OPEN_MAIN_DB; rc = sqlite3BtreeOpen(pVfs, zPath, db, &pNew->pBt, 0, flags); - sqlite3_free( zPath ); db->nDb++; + pNew->zDbSName = sqlite3DbStrDup(db, zName); } db->noSharedCache = 0; if( rc==SQLITE_CONSTRAINT ){ @@ -184,7 +184,6 @@ static void attachFunc( sqlite3BtreeLeave(pNew->pBt); } pNew->safety_level = SQLITE_DEFAULT_SYNCHRONOUS+1; - if( !REOPEN_AS_MEMDB(db) ) pNew->zDbSName = sqlite3DbStrDup(db, zName); if( rc==SQLITE_OK && pNew->zDbSName==0 ){ rc = SQLITE_NOMEM_BKPT; } @@ -212,15 +211,19 @@ static void attachFunc( break; case SQLITE_NULL: - /* No key specified. Use the key from the main database */ - sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); - if( nKey || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){ - rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + /* No key specified. Use the key from URI filename, or if none, + ** use the key from the main database. */ + if( sqlite3CodecQueryParameters(db, zName, zPath)==0 ){ + sqlite3CodecGetKey(db, 0, (void**)&zKey, &nKey); + if( nKey || sqlite3BtreeGetOptimalReserve(db->aDb[0].pBt)>0 ){ + rc = sqlite3CodecAttach(db, db->nDb-1, zKey, nKey); + } } break; } } #endif + sqlite3_free( zPath ); /* If the file was opened successfully, read the schema for the new database. ** If this fails, or if opening the file failed, then close the file and diff --git a/src/btree.c b/src/btree.c index 137500e..3b7ef90 100644 --- a/src/btree.c +++ b/src/btree.c @@ -660,13 +660,19 @@ static int saveCursorKey(BtCursor *pCur){ /* Only the rowid is required for a table btree */ pCur->nKey = sqlite3BtreeIntegerKey(pCur); }else{ - /* For an index btree, save the complete key content */ + /* For an index btree, save the complete key content. It is possible + ** that the current key is corrupt. In that case, it is possible that + ** the sqlite3VdbeRecordUnpack() function may overread the buffer by + ** up to the size of 1 varint plus 1 8-byte value when the cursor + ** position is restored. Hence the 17 bytes of padding allocated + ** below. */ void *pKey; pCur->nKey = sqlite3BtreePayloadSize(pCur); - pKey = sqlite3Malloc( pCur->nKey ); + pKey = sqlite3Malloc( pCur->nKey + 9 + 8 ); if( pKey ){ rc = sqlite3BtreePayload(pCur, 0, (int)pCur->nKey, pKey); if( rc==SQLITE_OK ){ + memset(((u8*)pKey)+pCur->nKey, 0, 9+8); pCur->pKey = pKey; }else{ sqlite3_free(pKey); @@ -798,11 +804,12 @@ static int btreeMoveto( UnpackedRecord *pIdxKey; /* Unpacked index key */ if( pKey ){ + KeyInfo *pKeyInfo = pCur->pKeyInfo; assert( nKey==(i64)(int)nKey ); - pIdxKey = sqlite3VdbeAllocUnpackedRecord(pCur->pKeyInfo); + pIdxKey = sqlite3VdbeAllocUnpackedRecord(pKeyInfo); if( pIdxKey==0 ) return SQLITE_NOMEM_BKPT; - sqlite3VdbeRecordUnpack(pCur->pKeyInfo, (int)nKey, pKey, pIdxKey); - if( pIdxKey->nField==0 ){ + sqlite3VdbeRecordUnpack(pKeyInfo, (int)nKey, pKey, pIdxKey); + if( pIdxKey->nField==0 || pIdxKey->nField>pKeyInfo->nAllField ){ rc = SQLITE_CORRUPT_BKPT; goto moveto_done; } @@ -838,7 +845,7 @@ static int btreeRestoreCursorPosition(BtCursor *pCur){ sqlite3_free(pCur->pKey); pCur->pKey = 0; assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_INVALID ); - pCur->skipNext |= skipNext; + if( skipNext ) pCur->skipNext = skipNext; if( pCur->skipNext && pCur->eState==CURSOR_VALID ){ pCur->eState = CURSOR_SKIPNEXT; } @@ -908,7 +915,6 @@ int sqlite3BtreeCursorRestore(BtCursor *pCur, int *pDifferentRow){ if( pCur->eState!=CURSOR_VALID ){ *pDifferentRow = 1; }else{ - assert( pCur->skipNext==0 ); *pDifferentRow = 0; } return SQLITE_OK; @@ -992,6 +998,13 @@ static void ptrmapPut(BtShared *pBt, Pgno key, u8 eType, Pgno parent, int *pRC){ *pRC = rc; return; } + if( ((char*)sqlite3PagerGetExtra(pDbPage))[0]!=0 ){ + /* The first byte of the extra data is the MemPage.isInit byte. + ** If that byte is set, it means this page is also being used + ** as a btree page. */ + *pRC = SQLITE_CORRUPT_BKPT; + goto ptrmap_exit; + } offset = PTRMAP_PTROFFSET(iPtrmap, key); if( offset<0 ){ *pRC = SQLITE_CORRUPT_BKPT; @@ -1054,7 +1067,7 @@ static int ptrmapGet(BtShared *pBt, Pgno key, u8 *pEType, Pgno *pPgno){ #else /* if defined SQLITE_OMIT_AUTOVACUUM */ #define ptrmapPut(w,x,y,z,rc) #define ptrmapGet(w,x,y,z) SQLITE_OK - #define ptrmapPutOvflPtr(x, y, rc) + #define ptrmapPutOvflPtr(x, y, z, rc) #endif /* @@ -1347,17 +1360,24 @@ static u16 cellSize(MemPage *pPage, int iCell){ #ifndef SQLITE_OMIT_AUTOVACUUM /* -** If the cell pCell, part of page pPage contains a pointer -** to an overflow page, insert an entry into the pointer-map -** for the overflow page. +** The cell pCell is currently part of page pSrc but will ultimately be part +** of pPage. (pSrc and pPager are often the same.) If pCell contains a +** pointer to an overflow page, insert an entry into the pointer-map for +** the overflow page that will be valid after pCell has been moved to pPage. */ -static void ptrmapPutOvflPtr(MemPage *pPage, u8 *pCell, int *pRC){ +static void ptrmapPutOvflPtr(MemPage *pPage, MemPage *pSrc, u8 *pCell,int *pRC){ CellInfo info; if( *pRC ) return; assert( pCell!=0 ); pPage->xParseCell(pPage, pCell, &info); if( info.nLocalaDataEnd, pCell, pCell+info.nLocal) ){ + testcase( pSrc!=pPage ); + *pRC = SQLITE_CORRUPT_BKPT; + return; + } + ovfl = get4byte(&pCell[info.nSize-4]); ptrmapPut(pPage->pBt, ovfl, PTRMAP_OVERFLOW1, pPage->pgno, pRC); } } @@ -1412,19 +1432,14 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ ** reconstruct the entire page. */ if( (int)data[hdr+7]<=nMaxFrag ){ int iFree = get2byte(&data[hdr+1]); + + /* If the initial freeblock offset were out of bounds, that would + ** have been detected by btreeInitPage() when it was computing the + ** number of free bytes on the page. */ + assert( iFree<=usableSize-4 ); if( iFree ){ int iFree2 = get2byte(&data[iFree]); - - /* pageFindSlot() has already verified that free blocks are sorted - ** in order of offset within the page, and that no block extends - ** past the end of the page. Provided the two free slots do not - ** overlap, this guarantees that the memmove() calls below will not - ** overwrite the usableSize byte buffer, even if the database page - ** is corrupt. */ - assert( iFree2==0 || iFree2>iFree ); - assert( iFree+get2byte(&data[iFree+2]) <= usableSize ); - assert( iFree2==0 || iFree2+get2byte(&data[iFree2+2]) <= usableSize ); - + if( iFree2>usableSize-4 ) return SQLITE_CORRUPT_PAGE(pPage); if( 0==iFree2 || (data[iFree2]==0 && data[iFree2+1]==0) ){ u8 *pEnd = &data[cellOffset + nCell*2]; u8 *pAddr; @@ -1435,9 +1450,9 @@ static int defragmentPage(MemPage *pPage, int nMaxFrag){ return SQLITE_CORRUPT_PAGE(pPage); } if( iFree2 ){ - assert( iFree+sz<=iFree2 ); /* Verified by pageFindSlot() */ + if( iFree+sz>iFree2 ) return SQLITE_CORRUPT_PAGE(pPage); sz2 = get2byte(&data[iFree2+2]); - assert( iFree+sz+sz2+iFree2-(iFree+sz) <= usableSize ); + if( iFree2+sz2 > usableSize ) return SQLITE_CORRUPT_PAGE(pPage); memmove(&data[iFree+sz+sz2], &data[iFree+sz], iFree2-(iFree+sz)); sz += sz2; } @@ -2992,9 +3007,9 @@ static int newDatabase(BtShared*); static int lockBtree(BtShared *pBt){ int rc; /* Result code from subfunctions */ MemPage *pPage1; /* Page 1 of the database file */ - int nPage; /* Number of pages in the database */ - int nPageFile = 0; /* Number of pages in the database file */ - int nPageHeader; /* Number of pages in the database according to hdr */ + u32 nPage; /* Number of pages in the database */ + u32 nPageFile = 0; /* Number of pages in the database file */ + u32 nPageHeader; /* Number of pages in the database according to hdr */ assert( sqlite3_mutex_held(pBt->mutex) ); assert( pBt->pPage1==0 ); @@ -3007,7 +3022,7 @@ static int lockBtree(BtShared *pBt){ ** a valid database file. */ nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData); - sqlite3PagerPagecount(pBt->pPager, &nPageFile); + sqlite3PagerPagecount(pBt->pPager, (int*)&nPageFile); if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){ nPage = nPageFile; } @@ -3088,6 +3103,7 @@ static int lockBtree(BtShared *pBt){ ){ goto page1_init_failed; } + pBt->btsFlags |= BTS_PAGESIZE_FIXED; assert( (pageSize & 7)==0 ); /* EVIDENCE-OF: R-59310-51205 The "reserved space" size in the 1-byte ** integer at offset 20 is the number of bytes of space at the end of @@ -3478,7 +3494,7 @@ static int setChildPtrmaps(MemPage *pPage){ for(i=0; ileaf ){ Pgno childPgno = get4byte(pCell); @@ -4404,6 +4420,7 @@ int sqlite3BtreeCloseCursor(BtCursor *pCur){ sqlite3_free(pCur->aOverflow); sqlite3_free(pCur->pKey); sqlite3BtreeLeave(pBtree); + pCur->pBtree = 0; } return SQLITE_OK; } @@ -4502,6 +4519,25 @@ u32 sqlite3BtreePayloadSize(BtCursor *pCur){ return pCur->info.nPayload; } +/* +** Return an upper bound on the size of any record for the table +** that the cursor is pointing into. +** +** This is an optimization. Everything will still work if this +** routine always returns 2147483647 (which is the largest record +** that SQLite can handle) or more. But returning a smaller value might +** prevent large memory allocations when trying to interpret a +** corrupt datrabase. +** +** The current implementation merely returns the size of the underlying +** database file. +*/ +sqlite3_int64 sqlite3BtreeMaxRecordSize(BtCursor *pCur){ + assert( cursorHoldsMutex(pCur) ); + assert( pCur->eState==CURSOR_VALID ); + return pCur->pBt->pageSize * (sqlite3_int64)pCur->pBt->nPage; +} + /* ** Given the page number of an overflow page in the database (parameter ** ovfl), this function finds the page number of the next page in the @@ -5316,7 +5352,7 @@ int sqlite3BtreeMovetoUnpacked( ** try to get there using sqlite3BtreeNext() rather than a full ** binary search. This is an optimization only. The correct answer ** is still obtained without this case, only a little more slowely */ - if( pCur->info.nKey+1==intKey && !pCur->skipNext ){ + if( pCur->info.nKey+1==intKey ){ *pRes = 0; rc = sqlite3BtreeNext(pCur, 0); if( rc==SQLITE_OK ){ @@ -5458,7 +5494,7 @@ int sqlite3BtreeMovetoUnpacked( testcase( nCell==0 ); /* Invalid key size: 0x80 0x80 0x00 */ testcase( nCell==1 ); /* Invalid key size: 0x80 0x80 0x01 */ testcase( nCell==2 ); /* Minimum legal index key size */ - if( nCell<2 ){ + if( nCell<2 || nCell/pCur->pBt->usableSize>pCur->pBt->nPage ){ rc = SQLITE_CORRUPT_PAGE(pPage); goto moveto_finish; } @@ -5590,7 +5626,6 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ MemPage *pPage; assert( cursorOwnsBtShared(pCur) ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); if( pCur->eState!=CURSOR_VALID ){ assert( (pCur->curFlags & BTCF_ValidOvfl)==0 ); rc = restoreCursorPosition(pCur); @@ -5600,14 +5635,9 @@ static SQLITE_NOINLINE int btreeNext(BtCursor *pCur){ if( CURSOR_INVALID==pCur->eState ){ return SQLITE_DONE; } - if( pCur->skipNext ){ - assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + if( pCur->eState==CURSOR_SKIPNEXT ){ pCur->eState = CURSOR_VALID; - if( pCur->skipNext>0 ){ - pCur->skipNext = 0; - return SQLITE_OK; - } - pCur->skipNext = 0; + if( pCur->skipNext>0 ) return SQLITE_OK; } } @@ -5662,7 +5692,6 @@ int sqlite3BtreeNext(BtCursor *pCur, int flags){ UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ assert( cursorOwnsBtShared(pCur) ); assert( flags==0 || flags==1 ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); pCur->info.nSize = 0; pCur->curFlags &= ~(BTCF_ValidNKey|BTCF_ValidOvfl); if( pCur->eState!=CURSOR_VALID ) return btreeNext(pCur); @@ -5703,7 +5732,6 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ MemPage *pPage; assert( cursorOwnsBtShared(pCur) ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); assert( (pCur->curFlags & (BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey))==0 ); assert( pCur->info.nSize==0 ); if( pCur->eState!=CURSOR_VALID ){ @@ -5714,14 +5742,9 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ if( CURSOR_INVALID==pCur->eState ){ return SQLITE_DONE; } - if( pCur->skipNext ){ - assert( pCur->eState==CURSOR_VALID || pCur->eState==CURSOR_SKIPNEXT ); + if( CURSOR_SKIPNEXT==pCur->eState ){ pCur->eState = CURSOR_VALID; - if( pCur->skipNext<0 ){ - pCur->skipNext = 0; - return SQLITE_OK; - } - pCur->skipNext = 0; + if( pCur->skipNext<0 ) return SQLITE_OK; } } @@ -5756,7 +5779,6 @@ static SQLITE_NOINLINE int btreePrevious(BtCursor *pCur){ int sqlite3BtreePrevious(BtCursor *pCur, int flags){ assert( cursorOwnsBtShared(pCur) ); assert( flags==0 || flags==1 ); - assert( pCur->skipNext==0 || pCur->eState!=CURSOR_VALID ); UNUSED_PARAMETER( flags ); /* Used in COMDB2 but not native SQLite */ pCur->curFlags &= ~(BTCF_AtLast|BTCF_ValidOvfl|BTCF_ValidNKey); pCur->info.nSize = 0; @@ -6092,7 +6114,7 @@ static int allocateBtreePage( TRACE(("ALLOCATE: %d from end of file\n", *pPgno)); } - assert( *pPgno!=PENDING_BYTE_PAGE(pBt) ); + assert( CORRUPT_DB || *pPgno!=PENDING_BYTE_PAGE(pBt) ); end_allocate_page: releasePage(pTrunk); @@ -6647,9 +6669,16 @@ static void insertCell( assert( idx >= pPage->cellOffset+2*pPage->nCell+2 || CORRUPT_DB ); assert( idx+sz <= (int)pPage->pBt->usableSize ); pPage->nFree -= (u16)(2 + sz); - memcpy(&data[idx], pCell, sz); if( iChild ){ + /* In a corrupt database where an entry in the cell index section of + ** a btree page has a value of 3 or less, the pCell value might point + ** as many as 4 bytes in front of the start of the aData buffer for + ** the source page. Make sure this does not cause problems by not + ** reading the first 4 bytes */ + memcpy(&data[idx+4], pCell+4, sz-4); put4byte(&data[idx], iChild); + }else{ + memcpy(&data[idx], pCell, sz); } pIns = pPage->aCellIdx + i*2; memmove(pIns+2, pIns, 2*(pPage->nCell - i)); @@ -6663,15 +6692,89 @@ static void insertCell( /* The cell may contain a pointer to an overflow page. If so, write ** the entry for the overflow page into the pointer map. */ - ptrmapPutOvflPtr(pPage, pCell, pRC); + ptrmapPutOvflPtr(pPage, pPage, pCell, pRC); } #endif } } +/* +** The following parameters determine how many adjacent pages get involved +** in a balancing operation. NN is the number of neighbors on either side +** of the page that participate in the balancing operation. NB is the +** total number of pages that participate, including the target page and +** NN neighbors on either side. +** +** The minimum value of NN is 1 (of course). Increasing NN above 1 +** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance +** in exchange for a larger degradation in INSERT and UPDATE performance. +** The value of NN appears to give the best results overall. +** +** (Later:) The description above makes it seem as if these values are +** tunable - as if you could change them and recompile and it would all work. +** But that is unlikely. NB has been 3 since the inception of SQLite and +** we have never tested any other value. +*/ +#define NN 1 /* Number of neighbors on either side of pPage */ +#define NB 3 /* (NN*2+1): Total pages involved in the balance */ + /* ** A CellArray object contains a cache of pointers and sizes for a ** consecutive sequence of cells that might be held on multiple pages. +** +** The cells in this array are the divider cell or cells from the pParent +** page plus up to three child pages. There are a total of nCell cells. +** +** pRef is a pointer to one of the pages that contributes cells. This is +** used to access information such as MemPage.intKey and MemPage.pBt->pageSize +** which should be common to all pages that contribute cells to this array. +** +** apCell[] and szCell[] hold, respectively, pointers to the start of each +** cell and the size of each cell. Some of the apCell[] pointers might refer +** to overflow cells. In other words, some apCel[] pointers might not point +** to content area of the pages. +** +** A szCell[] of zero means the size of that cell has not yet been computed. +** +** The cells come from as many as four different pages: +** +** ----------- +** | Parent | +** ----------- +** / | \ +** / | \ +** --------- --------- --------- +** |Child-1| |Child-2| |Child-3| +** --------- --------- --------- +** +** The order of cells is in the array is for an index btree is: +** +** 1. All cells from Child-1 in order +** 2. The first divider cell from Parent +** 3. All cells from Child-2 in order +** 4. The second divider cell from Parent +** 5. All cells from Child-3 in order +** +** For a table-btree (with rowids) the items 2 and 4 are empty because +** content exists only in leaves and there are no divider cells. +** +** For an index btree, the apEnd[] array holds pointer to the end of page +** for Child-1, the Parent, Child-2, the Parent (again), and Child-3, +** respectively. The ixNx[] array holds the number of cells contained in +** each of these 5 stages, and all stages to the left. Hence: +** +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 plus 1 for first divider. +** ixNx[2] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. +** ixNx[3] = Number of cells in Child-1 and Child-2 + both divider cells +** ixNx[4] = Total number of cells. +** +** For a table-btree, the concept is similar, except only apEnd[0]..apEnd[2] +** are used and they point to the leaf pages only, and the ixNx value are: +** +** ixNx[0] = Number of cells in Child-1. +** ixNx[1] = Number of cells in Child-1 and Child-2 + 1 for 1st divider. +** ixNx[2] = Number of cells in Child-1 and Child-2 + both divider cells */ typedef struct CellArray CellArray; struct CellArray { @@ -6679,6 +6782,8 @@ struct CellArray { MemPage *pRef; /* Reference page */ u8 **apCell; /* All cells begin balanced */ u16 *szCell; /* Local size of all cells in apCell[] */ + u8 *apEnd[NB*2]; /* MemPage.aDataEnd values */ + int ixNx[NB*2]; /* Index of at which we move to the next apEnd[] */ }; /* @@ -6729,36 +6834,59 @@ static u16 cachedCellSize(CellArray *p, int N){ ** responsibility of the caller to set it correctly. */ static int rebuildPage( - MemPage *pPg, /* Edit this page */ + CellArray *pCArray, /* Content to be added to page pPg */ + int iFirst, /* First cell in pCArray to use */ int nCell, /* Final number of cells on page */ - u8 **apCell, /* Array of cells */ - u16 *szCell /* Array of cell sizes */ + MemPage *pPg /* The page to be reconstructed */ ){ const int hdr = pPg->hdrOffset; /* Offset of header on pPg */ u8 * const aData = pPg->aData; /* Pointer to data for pPg */ const int usableSize = pPg->pBt->usableSize; u8 * const pEnd = &aData[usableSize]; - int i; + int i = iFirst; /* Which cell to copy from pCArray*/ + u32 j; /* Start of cell content area */ + int iEnd = i+nCell; /* Loop terminator */ u8 *pCellptr = pPg->aCellIdx; u8 *pTmp = sqlite3PagerTempSpace(pPg->pBt->pPager); u8 *pData; + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pSrcEnd; /* Current pCArray->apEnd[k] value */ - i = get2byte(&aData[hdr+5]); - memcpy(&pTmp[i], &aData[i], usableSize - i); + assert( i(u32)usableSize) ){ j = 0; } + memcpy(&pTmp[j], &aData[j], usableSize - j); + + for(k=0; pCArray->ixNx[k]<=i && ALWAYS(kapEnd[k]; pData = pEnd; - for(i=0; iapCell[i]; + u16 sz = pCArray->szCell[i]; + assert( sz>0 ); if( SQLITE_WITHIN(pCell,aData,pEnd) ){ + if( ((uptr)(pCell+sz))>(uptr)pEnd ) return SQLITE_CORRUPT_BKPT; pCell = &pTmp[pCell - aData]; + }else if( (uptr)(pCell+sz)>(uptr)pSrcEnd + && (uptr)(pCell)<(uptr)pSrcEnd + ){ + return SQLITE_CORRUPT_BKPT; } - pData -= szCell[i]; + + pData -= sz; put2byte(pCellptr, (pData - aData)); pCellptr += 2; if( pData < pCellptr ) return SQLITE_CORRUPT_BKPT; - memcpy(pData, pCell, szCell[i]); - assert( szCell[i]==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); - testcase( szCell[i]!=pPg->xCellSize(pPg,pCell) ); + memcpy(pData, pCell, sz); + assert( sz==pPg->xCellSize(pPg, pCell) || CORRUPT_DB ); + testcase( sz!=pPg->xCellSize(pPg,pCell) ); + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pSrcEnd = pCArray->apEnd[k]; + } } /* The pPg->nFree field is now set incorrectly. The caller will fix it. */ @@ -6773,12 +6901,11 @@ static int rebuildPage( } /* -** Array apCell[] contains nCell pointers to b-tree cells. Array szCell -** contains the size in bytes of each such cell. This function attempts to -** add the cells stored in the array to page pPg. If it cannot (because -** the page needs to be defragmented before the cells will fit), non-zero -** is returned. Otherwise, if the cells are added successfully, zero is -** returned. +** The pCArray objects contains pointers to b-tree cells and the cell sizes. +** This function attempts to add the cells stored in the array to page pPg. +** If it cannot (because the page needs to be defragmented before the cells +** will fit), non-zero is returned. Otherwise, if the cells are added +** successfully, zero is returned. ** ** Argument pCellptr points to the first entry in the cell-pointer array ** (part of page pPg) to populate. After cell apCell[0] is written to the @@ -6800,18 +6927,23 @@ static int rebuildPage( static int pageInsertArray( MemPage *pPg, /* Page to add cells to */ u8 *pBegin, /* End of cell-pointer array */ - u8 **ppData, /* IN/OUT: Page content -area pointer */ + u8 **ppData, /* IN/OUT: Page content-area pointer */ u8 *pCellptr, /* Pointer to cell-pointer area */ int iFirst, /* Index of first cell to add */ int nCell, /* Number of cells to add to pPg */ CellArray *pCArray /* Array of cells */ ){ - int i; - u8 *aData = pPg->aData; - u8 *pData = *ppData; - int iEnd = iFirst + nCell; + int i = iFirst; /* Loop counter - cell index to insert */ + u8 *aData = pPg->aData; /* Complete page */ + u8 *pData = *ppData; /* Content area. A subset of aData[] */ + int iEnd = iFirst + nCell; /* End of loop. One past last cell to ins */ + int k; /* Current slot in pCArray->apEnd[] */ + u8 *pEnd; /* Maximum extent of cell data */ assert( CORRUPT_DB || pPg->hdrOffset==0 ); /* Never called on page 1 */ - for(i=iFirst; iixNx[k]<=i && ALWAYS(kapEnd[k]; + while( 1 /*Exit by break*/ ){ int sz, rc; u8 *pSlot; sz = cachedCellSize(pCArray, i); @@ -6826,20 +6958,33 @@ static int pageInsertArray( assert( (pSlot+sz)<=pCArray->apCell[i] || pSlot>=(pCArray->apCell[i]+sz) || CORRUPT_DB ); + if( (uptr)(pCArray->apCell[i]+sz)>(uptr)pEnd + && (uptr)(pCArray->apCell[i])<(uptr)pEnd + ){ + assert( CORRUPT_DB ); + (void)SQLITE_CORRUPT_BKPT; + return 1; + } memmove(pSlot, pCArray->apCell[i], sz); put2byte(pCellptr, (pSlot - aData)); pCellptr += 2; + i++; + if( i>=iEnd ) break; + if( pCArray->ixNx[k]<=i ){ + k++; + pEnd = pCArray->apEnd[k]; + } } *ppData = pData; return 0; } /* -** Array apCell[] contains nCell pointers to b-tree cells. Array szCell -** contains the size in bytes of each such cell. This function adds the -** space associated with each cell in the array that is currently stored -** within the body of pPg to the pPg free-list. The cell-pointers and other -** fields of the page are not updated. +** The pCArray object contains pointers to b-tree cells and their sizes. +** +** This function adds the space associated with each cell in the array +** that is currently stored within the body of pPg to the pPg free-list. +** The cell-pointers and other fields of the page are not updated. ** ** This function returns the total number of cells added to the free-list. */ @@ -6889,9 +7034,9 @@ static int pageFreeArray( } /* -** apCell[] and szCell[] contains pointers to and sizes of all cells in the -** pages being balanced. The current page, pPg, has pPg->nCell cells starting -** with apCell[iOld]. After balancing, this page should hold nNew cells +** pCArray contains pointers to and sizes of all cells in the page being +** balanced. The current page, pPg, has pPg->nCell cells starting with +** pCArray->apCell[iOld]. After balancing, this page should hold nNew cells ** starting at apCell[iNew]. ** ** This routine makes the necessary adjustments to pPg so that it contains @@ -6923,13 +7068,17 @@ static int editPage( #endif /* Remove cells from the start and end of the page */ + assert( nCell>=0 ); if( iOldnCell ) return SQLITE_CORRUPT_BKPT; memmove(pPg->aCellIdx, &pPg->aCellIdx[nShift*2], nCell*2); nCell -= nShift; } if( iNewEnd < iOldEnd ){ - nCell -= pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); + int nTail = pageFreeArray(pPg, iNewEnd, iOldEnd - iNewEnd, pCArray); + assert( nCell>=nTail ); + nCell -= nTail; } pData = &aData[get2byteNotZero(&aData[hdr+5])]; @@ -6939,6 +7088,7 @@ static int editPage( if( iNew=0 ); pCellptr = pPg->aCellIdx; memmove(&pCellptr[nAdd*2], pCellptr, nCell*2); if( pageInsertArray( @@ -6953,6 +7103,7 @@ static int editPage( int iCell = (iOld + pPg->aiOvfl[i]) - iNew; if( iCell>=0 && iCellaCellIdx[iCell * 2]; + assert( nCell>=iCell ); memmove(&pCellptr[2], pCellptr, (nCell - iCell) * 2); nCell++; if( pageInsertArray( @@ -6963,6 +7114,7 @@ static int editPage( } /* Append cells to the end of the page */ + assert( nCell>=0 ); pCellptr = &pPg->aCellIdx[nCell*2]; if( pageInsertArray( pPg, pBegin, &pData, pCellptr, @@ -6991,24 +7143,9 @@ static int editPage( editpage_fail: /* Unable to edit this page. Rebuild it from scratch instead. */ populateCellCache(pCArray, iNew, nNew); - return rebuildPage(pPg, nNew, &pCArray->apCell[iNew], &pCArray->szCell[iNew]); + return rebuildPage(pCArray, iNew, nNew, pPg); } -/* -** The following parameters determine how many adjacent pages get involved -** in a balancing operation. NN is the number of neighbors on either side -** of the page that participate in the balancing operation. NB is the -** total number of pages that participate, including the target page and -** NN neighbors on either side. -** -** The minimum value of NN is 1 (of course). Increasing NN above 1 -** (to 2 or 3) gives a modest improvement in SELECT and DELETE performance -** in exchange for a larger degradation in INSERT and UPDATE performance. -** The value of NN appears to give the best results overall. -*/ -#define NN 1 /* Number of neighbors on either side of pPage */ -#define NB (NN*2+1) /* Total pages involved in the balance */ - #ifndef SQLITE_OMIT_QUICKBALANCE /* @@ -7044,8 +7181,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ assert( sqlite3PagerIswriteable(pParent->pDbPage) ); assert( pPage->nOverflow==1 ); - /* This error condition is now caught prior to reaching this function */ - if( NEVER(pPage->nCell==0) ) return SQLITE_CORRUPT_BKPT; + if( pPage->nCell==0 ) return SQLITE_CORRUPT_BKPT; /* dbfuzz001.test */ /* Allocate a new page. This page will become the right-sibling of ** pPage. Make the parent page writable, so that the new divider cell @@ -7059,12 +7195,22 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ u8 *pCell = pPage->apOvfl[0]; u16 szCell = pPage->xCellSize(pPage, pCell); u8 *pStop; + CellArray b; assert( sqlite3PagerIswriteable(pNew->pDbPage) ); - assert( pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); + assert( CORRUPT_DB || pPage->aData[0]==(PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF) ); zeroPage(pNew, PTF_INTKEY|PTF_LEAFDATA|PTF_LEAF); - rc = rebuildPage(pNew, 1, &pCell, &szCell); - if( NEVER(rc) ) return rc; + b.nCell = 1; + b.pRef = pPage; + b.apCell = &pCell; + b.szCell = &szCell; + b.apEnd[0] = pPage->aDataEnd; + b.ixNx[0] = 2; + rc = rebuildPage(&b, 0, 1, pNew); + if( NEVER(rc) ){ + releasePage(pNew); + return rc; + } pNew->nFree = pBt->usableSize - pNew->cellOffset - 2 - szCell; /* If this is an auto-vacuum database, update the pointer map @@ -7079,7 +7225,7 @@ static int balance_quick(MemPage *pParent, MemPage *pPage, u8 *pSpace){ if( ISAUTOVACUUM ){ ptrmapPut(pBt, pgnoNew, PTRMAP_BTREE, pParent->pgno, &rc); if( szCell>pNew->minLocal ){ - ptrmapPutOvflPtr(pNew, pCell, &rc); + ptrmapPutOvflPtr(pNew, pNew, pCell, &rc); } } @@ -7302,10 +7448,6 @@ static int balance_nonroot( assert( sqlite3_mutex_held(pBt->mutex) ); assert( sqlite3PagerIswriteable(pParent->pDbPage) ); -#if 0 - TRACE(("BALANCE: begin page %d child of %d\n", pPage->pgno, pParent->pgno)); -#endif - /* At this point pParent may have at most one overflow cell. And if ** this overflow cell is present, it must be the cell with ** index iParentIdx. This scenario comes about when this function @@ -7546,8 +7688,15 @@ static int balance_nonroot( ** */ usableSpace = pBt->usableSize - 12 + leafCorrection; - for(i=0; iaDataEnd; + b.ixNx[k] = cntOld[i]; + if( !leafData ){ + k++; + b.apEnd[k] = pParent->aDataEnd; + b.ixNx[k] = cntOld[i]+1; + } szNew[i] = usableSpace - p->nFree; for(j=0; jnOverflow; j++){ szNew[i] += 2 + p->xCellSize(p, p->apOvfl[j]); @@ -7771,7 +7920,8 @@ static int balance_nonroot( ** populated, not here. */ if( ISAUTOVACUUM ){ - MemPage *pNew = apNew[0]; + MemPage *pOld; + MemPage *pNew = pOld = apNew[0]; u8 *aOld = pNew->aData; int cntOldNext = pNew->nCell + pNew->nOverflow; int usableSize = pBt->usableSize; @@ -7781,7 +7931,7 @@ static int balance_nonroot( for(i=0; inCell + pOld->nOverflow + !leafData; aOld = pOld->aData; } @@ -7804,7 +7954,7 @@ static int balance_nonroot( ptrmapPut(pBt, get4byte(pCell), PTRMAP_BTREE, pNew->pgno, &rc); } if( cachedCellSize(&b,i)>pNew->minLocal ){ - ptrmapPutOvflPtr(pNew, pCell, &rc); + ptrmapPutOvflPtr(pNew, pOld, pCell, &rc); } if( rc ) goto balance_cleanup; } @@ -8228,7 +8378,11 @@ static int btreeOverwriteContent( if( memcmp(pDest, ((u8*)pX->pData) + iOffset, iAmt)!=0 ){ int rc = sqlite3PagerWrite(pPage->pDbPage); if( rc ) return rc; - memcpy(pDest, ((u8*)pX->pData) + iOffset, iAmt); + /* In a corrupt database, it is possible for the source and destination + ** buffers to overlap. This is harmless since the database is already + ** corrupt but it does cause valgrind and ASAN warnings. So use + ** memmove(). */ + memmove(pDest, ((u8*)pX->pData) + iOffset, iAmt); } } return SQLITE_OK; @@ -8623,6 +8777,7 @@ int sqlite3BtreeDelete(BtCursor *pCur, u8 flags){ if( bPreserve ){ if( !pPage->leaf || (pPage->nFree+cellSizePtr(pPage,pCell)+2)>(int)(pBt->usableSize*2/3) + || pPage->nCell==1 /* See dbfuzz001.test for a test case */ ){ /* A b-tree rebalance will be required after deleting this entry. ** Save the cursor key. */ @@ -9401,18 +9556,18 @@ static void checkList( } pOvflData = (unsigned char *)sqlite3PagerGetData(pOvflPage); if( isFreeList ){ - int n = get4byte(&pOvflData[4]); + u32 n = (u32)get4byte(&pOvflData[4]); #ifndef SQLITE_OMIT_AUTOVACUUM if( pCheck->pBt->autoVacuum ){ checkPtrmap(pCheck, iPage, PTRMAP_FREEPAGE, 0); } #endif - if( n>(int)pCheck->pBt->usableSize/4-2 ){ + if( n>pCheck->pBt->usableSize/4-2 ){ checkAppendMsg(pCheck, "freelist leaf count too big on page %d", iPage); N--; }else{ - for(i=0; ipBt->autoVacuum ){ @@ -9789,7 +9944,7 @@ char *sqlite3BtreeIntegrityCheck( Pgno i; IntegrityCk sCheck; BtShared *pBt = p->pBt; - int savedDbFlags = pBt->db->flags; + u64 savedDbFlags = pBt->db->flags; char zErr[100]; VVA_ONLY( int nRef ); @@ -9856,7 +10011,7 @@ char *sqlite3BtreeIntegrityCheck( } #endif testcase( pBt->db->flags & SQLITE_CellSizeCk ); - pBt->db->flags &= ~SQLITE_CellSizeCk; + pBt->db->flags &= ~(u64)SQLITE_CellSizeCk; for(i=0; (int)ipBt->mutex. ** ** skipNext meaning: -** eState==SKIPNEXT && skipNext>0: Next sqlite3BtreeNext() is no-op. -** eState==SKIPNEXT && skipNext<0: Next sqlite3BtreePrevious() is no-op. -** eState==FAULT: Cursor fault with skipNext as error code. +** The meaning of skipNext depends on the value of eState: +** +** eState Meaning of skipNext +** VALID skipNext is meaningless and is ignored +** INVALID skipNext is meaningless and is ignored +** SKIPNEXT sqlite3BtreeNext() is a no-op if skipNext>0 and +** sqlite3BtreePrevious() is no-op if skipNext<0. +** REQUIRESEEK restoreCursorPosition() restores the cursor to +** eState=SKIPNEXT if skipNext!=0 +** FAULT skipNext holds the cursor fault error code. */ struct BtCursor { u8 eState; /* One of the CURSOR_XXX constants (see below) */ diff --git a/src/build.c b/src/build.c index e0fed8a..3daa677 100644 --- a/src/build.c +++ b/src/build.c @@ -227,7 +227,7 @@ void sqlite3FinishCoding(Parse *pParse){ if( v && pParse->nErr==0 && !db->mallocFailed ){ /* A minimum of one cursor is required if autoincrement is used * See ticket [a696379c1f08866] */ - if( pParse->pAinc!=0 && pParse->nTab==0 ) pParse->nTab = 1; + assert( pParse->pAinc==0 || pParse->nTab>0 ); sqlite3VdbeMakeReady(v, pParse); pParse->rc = SQLITE_DONE; }else{ @@ -354,26 +354,32 @@ Table *sqlite3LocateTable( p = sqlite3FindTable(db, zName, zDbase); if( p==0 ){ - const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table"; #ifndef SQLITE_OMIT_VIRTUALTABLE /* If zName is the not the name of a table in the schema created using ** CREATE, then check to see if it is the name of an virtual table that ** can be an eponymous virtual table. */ - Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName); - if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){ - pMod = sqlite3PragmaVtabRegister(db, zName); - } - if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ - return pMod->pEpoTab; + if( pParse->disableVtab==0 ){ + Module *pMod = (Module*)sqlite3HashFind(&db->aModule, zName); + if( pMod==0 && sqlite3_strnicmp(zName, "pragma_", 7)==0 ){ + pMod = sqlite3PragmaVtabRegister(db, zName); + } + if( pMod && sqlite3VtabEponymousTableInit(pParse, pMod) ){ + return pMod->pEpoTab; + } } #endif - if( (flags & LOCATE_NOERR)==0 ){ - if( zDbase ){ - sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName); - }else{ - sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); - } - pParse->checkSchema = 1; + if( flags & LOCATE_NOERR ) return 0; + pParse->checkSchema = 1; + }else if( IsVirtual(p) && pParse->disableVtab ){ + p = 0; + } + + if( p==0 ){ + const char *zMsg = flags & LOCATE_VIEW ? "no such view" : "no such table"; + if( zDbase ){ + sqlite3ErrorMsg(pParse, "%s: %s.%s", zMsg, zDbase, zName); + }else{ + sqlite3ErrorMsg(pParse, "%s: %s", zMsg, zName); } } @@ -636,12 +642,6 @@ static void SQLITE_NOINLINE deleteTable(sqlite3 *db, Table *pTable){ /* Delete the Table structure itself. */ -#ifdef SQLITE_ENABLE_NORMALIZE - if( pTable->pColHash ){ - sqlite3HashClear(pTable->pColHash); - sqlite3_free(pTable->pColHash); - } -#endif sqlite3DeleteColumnNames(db, pTable); sqlite3DbFree(db, pTable->zName); sqlite3DbFree(db, pTable->zColAff); @@ -2638,6 +2638,7 @@ void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){ */ if( IsVirtual(pTab) ){ sqlite3VdbeAddOp4(v, OP_VDestroy, iDb, 0, 0, pTab->zName, 0); + sqlite3MayAbort(pParse); } sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0); sqlite3ChangeCookie(pParse, iDb); @@ -3466,6 +3467,11 @@ void sqlite3CreateIndex( } } if( idxType==SQLITE_IDXTYPE_PRIMARYKEY ) pIdx->idxType = idxType; + if( IN_RENAME_OBJECT ){ + pIndex->pNext = pParse->pNewIndex; + pParse->pNewIndex = pIndex; + pIndex = 0; + } goto exit_create_index; } } @@ -3481,6 +3487,14 @@ void sqlite3CreateIndex( Index *p; assert( !IN_SPECIAL_PARSE ); assert( sqlite3SchemaMutexHeld(db, 0, pIndex->pSchema) ); + if( pTblName!=0 ){ + pIndex->tnum = db->init.newTnum; + if( sqlite3IndexHasDuplicateRootPage(pIndex) ){ + sqlite3ErrorMsg(pParse, "invalid rootpage"); + pParse->rc = SQLITE_CORRUPT_BKPT; + goto exit_create_index; + } + } p = sqlite3HashInsert(&pIndex->pSchema->idxHash, pIndex->zName, pIndex); if( p ){ @@ -3489,9 +3503,6 @@ void sqlite3CreateIndex( goto exit_create_index; } db->mDbFlags |= DBFLAG_SchemaChange; - if( pTblName!=0 ){ - pIndex->tnum = db->init.newTnum; - } } /* If this is the initial CREATE INDEX statement (or CREATE TABLE if the @@ -3817,6 +3828,18 @@ int sqlite3IdListIndex(IdList *pList, const char *zName){ return -1; } +/* +** Maximum size of a SrcList object. +** The SrcList object is used to represent the FROM clause of a +** SELECT statement, and the query planner cannot deal with more +** than 64 tables in a join. So any value larger than 64 here +** is sufficient for most uses. Smaller values, like say 10, are +** appropriate for small and memory-limited applications. +*/ +#ifndef SQLITE_MAX_SRCLIST +# define SQLITE_MAX_SRCLIST 200 +#endif + /* ** Expand the space allocated for the given SrcList object by ** creating nExtra new slots beginning at iStart. iStart is zero based. @@ -3833,11 +3856,12 @@ int sqlite3IdListIndex(IdList *pList, const char *zName){ ** the iStart value would be 0. The result then would ** be: nil, nil, nil, A, B. ** -** If a memory allocation fails the SrcList is unchanged. The -** db->mallocFailed flag will be set to true. +** If a memory allocation fails or the SrcList becomes too large, leave +** the original SrcList unchanged, return NULL, and leave an error message +** in pParse. */ SrcList *sqlite3SrcListEnlarge( - sqlite3 *db, /* Database connection to notify of OOM errors */ + Parse *pParse, /* Parsing context into which errors are reported */ SrcList *pSrc, /* The SrcList to be enlarged */ int nExtra, /* Number of new slots to add to pSrc->a[] */ int iStart /* Index in pSrc->a[] of first new slot */ @@ -3854,16 +3878,22 @@ SrcList *sqlite3SrcListEnlarge( if( (u32)pSrc->nSrc+nExtra>pSrc->nAlloc ){ SrcList *pNew; int nAlloc = pSrc->nSrc*2+nExtra; - int nGot; + sqlite3 *db = pParse->db; + + if( pSrc->nSrc+nExtra>=SQLITE_MAX_SRCLIST ){ + sqlite3ErrorMsg(pParse, "too many FROM clause terms, max: %d", + SQLITE_MAX_SRCLIST); + return 0; + } + if( nAlloc>SQLITE_MAX_SRCLIST ) nAlloc = SQLITE_MAX_SRCLIST; pNew = sqlite3DbRealloc(db, pSrc, sizeof(*pSrc) + (nAlloc-1)*sizeof(pSrc->a[0]) ); if( pNew==0 ){ assert( db->mallocFailed ); - return pSrc; + return 0; } pSrc = pNew; - nGot = (sqlite3DbMallocSize(db, pNew) - sizeof(*pSrc))/sizeof(pSrc->a[0])+1; - pSrc->nAlloc = nGot; + pSrc->nAlloc = nAlloc; } /* Move existing slots that come after the newly inserted slots @@ -3888,7 +3918,8 @@ SrcList *sqlite3SrcListEnlarge( ** Append a new table name to the given SrcList. Create a new SrcList if ** need be. A new entry is created in the SrcList even if pTable is NULL. ** -** A SrcList is returned, or NULL if there is an OOM error. The returned +** A SrcList is returned, or NULL if there is an OOM error or if the +** SrcList grows to large. The returned ** SrcList might be the same as the SrcList that was input or it might be ** a new one. If an OOM error does occurs, then the prior value of pList ** that is input to this routine is automatically freed. @@ -3919,27 +3950,32 @@ SrcList *sqlite3SrcListEnlarge( ** before being added to the SrcList. */ SrcList *sqlite3SrcListAppend( - sqlite3 *db, /* Connection to notify of malloc failures */ + Parse *pParse, /* Parsing context, in which errors are reported */ SrcList *pList, /* Append to this SrcList. NULL creates a new SrcList */ Token *pTable, /* Table to append */ Token *pDatabase /* Database of the table */ ){ struct SrcList_item *pItem; + sqlite3 *db; assert( pDatabase==0 || pTable!=0 ); /* Cannot have C without B */ - assert( db!=0 ); + assert( pParse!=0 ); + assert( pParse->db!=0 ); + db = pParse->db; if( pList==0 ){ - pList = sqlite3DbMallocRawNN(db, sizeof(SrcList) ); + pList = sqlite3DbMallocRawNN(pParse->db, sizeof(SrcList) ); if( pList==0 ) return 0; pList->nAlloc = 1; pList->nSrc = 1; memset(&pList->a[0], 0, sizeof(pList->a[0])); pList->a[0].iCursor = -1; }else{ - pList = sqlite3SrcListEnlarge(db, pList, 1, pList->nSrc); - } - if( db->mallocFailed ){ - sqlite3SrcListDelete(db, pList); - return 0; + SrcList *pNew = sqlite3SrcListEnlarge(pParse, pList, 1, pList->nSrc); + if( pNew==0 ){ + sqlite3SrcListDelete(db, pList); + return 0; + }else{ + pList = pNew; + } } pItem = &pList->a[pList->nSrc-1]; if( pDatabase && pDatabase->z==0 ){ @@ -4028,7 +4064,7 @@ SrcList *sqlite3SrcListAppendFromTerm( ); goto append_from_error; } - p = sqlite3SrcListAppend(db, p, pTable, pDatabase); + p = sqlite3SrcListAppend(pParse, p, pTable, pDatabase); if( p==0 ){ goto append_from_error; } @@ -4417,13 +4453,15 @@ static int collationMatch(const char *zColl, Index *pIndex){ */ #ifndef SQLITE_OMIT_REINDEX static void reindexTable(Parse *pParse, Table *pTab, char const *zColl){ - Index *pIndex; /* An index associated with pTab */ + if( !IsVirtual(pTab) ){ + Index *pIndex; /* An index associated with pTab */ - for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ - if( zColl==0 || collationMatch(zColl, pIndex) ){ - int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); - sqlite3BeginWriteOperation(pParse, 0, iDb); - sqlite3RefillIndex(pParse, pIndex, -1); + for(pIndex=pTab->pIndex; pIndex; pIndex=pIndex->pNext){ + if( zColl==0 || collationMatch(zColl, pIndex) ){ + int iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema); + sqlite3BeginWriteOperation(pParse, 0, iDb); + sqlite3RefillIndex(pParse, pIndex, -1); + } } } } diff --git a/src/callback.c b/src/callback.c index faf6d52..ad53bd4 100644 --- a/src/callback.c +++ b/src/callback.c @@ -283,7 +283,7 @@ static int matchQuality( ** Search a FuncDefHash for a function with the given name. Return ** a pointer to the matching FuncDef if found, or 0 if there is no match. */ -static FuncDef *functionSearch( +FuncDef *sqlite3FunctionSearch( int h, /* Hash of the name */ const char *zFunc /* Name of function */ ){ @@ -295,21 +295,6 @@ static FuncDef *functionSearch( } return 0; } -#ifdef SQLITE_ENABLE_NORMALIZE -FuncDef *sqlite3FunctionSearchN( - int h, /* Hash of the name */ - const char *zFunc, /* Name of function */ - int nFunc /* Length of the name */ -){ - FuncDef *p; - for(p=sqlite3BuiltinFunctions.a[h]; p; p=p->u.pHash){ - if( sqlite3StrNICmp(p->zName, zFunc, nFunc)==0 ){ - return p; - } - } - return 0; -} -#endif /* SQLITE_ENABLE_NORMALIZE */ /* ** Insert a new FuncDef into a FuncDefHash hash table. @@ -325,7 +310,7 @@ void sqlite3InsertBuiltinFuncs( int nName = sqlite3Strlen30(zName); int h = SQLITE_FUNC_HASH(zName[0], nName); assert( zName[0]>='a' && zName[0]<='z' ); - pOther = functionSearch(h, zName); + pOther = sqlite3FunctionSearch(h, zName); if( pOther ){ assert( pOther!=&aDef[i] && pOther->pNext!=&aDef[i] ); aDef[i].pNext = pOther->pNext; @@ -403,7 +388,7 @@ FuncDef *sqlite3FindFunction( if( !createFlag && (pBest==0 || (db->mDbFlags & DBFLAG_PreferBuiltin)!=0) ){ bestScore = 0; h = SQLITE_FUNC_HASH(sqlite3UpperToLower[(u8)zName[0]], nName); - p = functionSearch(h, zName); + p = sqlite3FunctionSearch(h, zName); while( p ){ int score = matchQuality(p, nArg, enc); if( score>bestScore ){ diff --git a/src/dbstat.c b/src/dbstat.c index a6e521b..9b72fb1 100644 --- a/src/dbstat.c +++ b/src/dbstat.c @@ -531,6 +531,10 @@ statNextRestart: goto statNextRestart; /* Tail recursion */ } pCsr->iPage++; + if( pCsr->iPage>=ArraySize(pCsr->aPage) ){ + statResetCsr(pCsr); + return SQLITE_CORRUPT_BKPT; + } assert( p==&pCsr->aPage[pCsr->iPage-1] ); if( p->iCell==p->nCell ){ @@ -602,7 +606,6 @@ static int statFilter( StatTable *pTab = (StatTable*)(pCursor->pVtab); char *zSql; int rc = SQLITE_OK; - char *zMaster; if( idxNum==1 ){ const char *zDbase = (const char*)sqlite3_value_text(argv[0]); @@ -618,13 +621,12 @@ static int statFilter( statResetCsr(pCsr); sqlite3_finalize(pCsr->pStmt); pCsr->pStmt = 0; - zMaster = pCsr->iDb==1 ? "sqlite_temp_master" : "sqlite_master"; zSql = sqlite3_mprintf( "SELECT 'sqlite_master' AS name, 1 AS rootpage, 'table' AS type" " UNION ALL " "SELECT name, rootpage, type" - " FROM \"%w\".%s WHERE rootpage!=0" - " ORDER BY name", pTab->db->aDb[pCsr->iDb].zDbSName, zMaster); + " FROM \"%w\".sqlite_master WHERE rootpage!=0" + " ORDER BY name", pTab->db->aDb[pCsr->iDb].zDbSName); if( zSql==0 ){ return SQLITE_NOMEM_BKPT; }else{ diff --git a/src/delete.c b/src/delete.c index 4ba8e42..e3a0abc 100644 --- a/src/delete.c +++ b/src/delete.c @@ -117,7 +117,7 @@ void sqlite3MaterializeView( sqlite3 *db = pParse->db; int iDb = sqlite3SchemaToIndex(db, pView->pSchema); pWhere = sqlite3ExprDup(db, pWhere, 0); - pFrom = sqlite3SrcListAppend(db, 0, 0, 0); + pFrom = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pFrom ){ assert( pFrom->nSrc==1 ); pFrom->a[0].zName = sqlite3DbStrDup(db, pView->zName); @@ -517,7 +517,7 @@ void sqlite3DeleteFrom( /* If this DELETE cannot use the ONEPASS strategy, this is the ** end of the WHERE loop */ if( eOnePass!=ONEPASS_OFF ){ - addrBypass = sqlite3VdbeMakeLabel(v); + addrBypass = sqlite3VdbeMakeLabel(pParse); }else{ sqlite3WhereEnd(pWInfo); } @@ -706,7 +706,7 @@ void sqlite3GenerateRowDelete( /* Seek cursor iCur to the row to delete. If this row no longer exists ** (this can happen if a trigger program has already deleted it), do ** not attempt to delete it or fire any DELETE triggers. */ - iLabel = sqlite3VdbeMakeLabel(v); + iLabel = sqlite3VdbeMakeLabel(pParse); opSeek = HasRowid(pTab) ? OP_NotExists : OP_NotFound; if( eMode==ONEPASS_OFF ){ sqlite3VdbeAddOp4Int(v, opSeek, iDataCur, iLabel, iPk, nPk); @@ -912,7 +912,7 @@ int sqlite3GenerateIndexKey( if( piPartIdxLabel ){ if( pIdx->pPartIdxWhere ){ - *piPartIdxLabel = sqlite3VdbeMakeLabel(v); + *piPartIdxLabel = sqlite3VdbeMakeLabel(pParse); pParse->iSelfTab = iDataCur + 1; sqlite3ExprIfFalseDup(pParse, pIdx->pPartIdxWhere, *piPartIdxLabel, SQLITE_JUMPIFNULL); diff --git a/src/expr.c b/src/expr.c index d4eb9de..03ecf15 100644 --- a/src/expr.c +++ b/src/expr.c @@ -141,8 +141,8 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ while( p ){ int op = p->op; if( p->flags & EP_Generic ) break; - if( (op==TK_AGG_COLUMN || op==TK_COLUMN - || op==TK_REGISTER || op==TK_TRIGGER) + if( op==TK_REGISTER ) op = p->op2; + if( (op==TK_AGG_COLUMN || op==TK_COLUMN || op==TK_TRIGGER) && p->y.pTab!=0 ){ /* op==TK_REGISTER && p->y.pTab!=0 happens when pExpr was originally @@ -158,7 +158,7 @@ CollSeq *sqlite3ExprCollSeq(Parse *pParse, Expr *pExpr){ p = p->pLeft; continue; } - if( op==TK_COLLATE || (op==TK_REGISTER && p->op2==TK_COLLATE) ){ + if( op==TK_COLLATE ){ pColl = sqlite3GetCollSeq(pParse, ENC(db), 0, p->u.zToken); break; } @@ -465,6 +465,7 @@ Expr *sqlite3ExprForVectorField( }else{ if( pVector->op==TK_VECTOR ) pVector = pVector->x.pList->a[iField].pExpr; pRet = sqlite3ExprDup(pParse->db, pVector, 0); + sqlite3RenameTokenRemap(pParse, pRet, pVector); } return pRet; } @@ -481,7 +482,7 @@ static int exprCodeSubselect(Parse *pParse, Expr *pExpr){ int reg = 0; #ifndef SQLITE_OMIT_SUBQUERY if( pExpr->op==TK_SELECT ){ - reg = sqlite3CodeSubselect(pParse, pExpr, 0, 0); + reg = sqlite3CodeSubselect(pParse, pExpr); } #endif return reg; @@ -553,7 +554,7 @@ static void codeVectorCompare( int regLeft = 0; int regRight = 0; u8 opx = op; - int addrDone = sqlite3VdbeMakeLabel(v); + int addrDone = sqlite3VdbeMakeLabel(pParse); if( nLeft!=sqlite3ExprVectorSize(pRight) ){ sqlite3ErrorMsg(pParse, "row value misused"); @@ -780,8 +781,7 @@ Expr *sqlite3ExprAlloc( if( pToken->n ) memcpy(pNew->u.zToken, pToken->z, pToken->n); pNew->u.zToken[pToken->n] = 0; if( dequote && sqlite3Isquote(pNew->u.zToken[0]) ){ - if( pNew->u.zToken[0]=='"' ) pNew->flags |= EP_DblQuoted; - sqlite3Dequote(pNew->u.zToken); + sqlite3DequoteExpr(pNew); } } } @@ -850,7 +850,7 @@ Expr *sqlite3PExpr( Expr *pRight /* Right operand */ ){ Expr *p; - if( op==TK_AND && pParse->nErr==0 ){ + if( op==TK_AND && pParse->nErr==0 && !IN_RENAME_OBJECT ){ /* Take advantage of short-circuit false optimization for AND */ p = sqlite3ExprAnd(pParse->db, pLeft, pRight); }else{ @@ -1099,6 +1099,16 @@ static int exprStructSize(Expr *p){ return EXPR_FULLSIZE; } +/* +** Copy the complete content of an Expr node, taking care not to read +** past the end of the structure for a reduced-size version of the source +** Expr. +*/ +static void exprNodeCopy(Expr *pDest, Expr *pSrc){ + memset(pDest, 0, sizeof(Expr)); + memcpy(pDest, pSrc, exprStructSize(pSrc)); +} + /* ** The dupedExpr*Size() routines each return the number of bytes required ** to store a copy of an expression or expression tree. They differ in @@ -1330,6 +1340,36 @@ static With *withDup(sqlite3 *db, With *p){ # define withDup(x,y) 0 #endif +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** The gatherSelectWindows() procedure and its helper routine +** gatherSelectWindowsCallback() are used to scan all the expressions +** an a newly duplicated SELECT statement and gather all of the Window +** objects found there, assembling them onto the linked list at Select->pWin. +*/ +static int gatherSelectWindowsCallback(Walker *pWalker, Expr *pExpr){ + if( pExpr->op==TK_FUNCTION && pExpr->y.pWin!=0 ){ + assert( ExprHasProperty(pExpr, EP_WinFunc) ); + pExpr->y.pWin->pNextWin = pWalker->u.pSelect->pWin; + pWalker->u.pSelect->pWin = pExpr->y.pWin; + } + return WRC_Continue; +} +static int gatherSelectWindowsSelectCallback(Walker *pWalker, Select *p){ + return p==pWalker->u.pSelect ? WRC_Continue : WRC_Prune; +} +static void gatherSelectWindows(Select *p){ + Walker w; + w.xExprCallback = gatherSelectWindowsCallback; + w.xSelectCallback = gatherSelectWindowsSelectCallback; + w.xSelectCallback2 = 0; + w.pParse = 0; + w.u.pSelect = p; + sqlite3WalkSelect(&w, p); +} +#endif + + /* ** The following group of routines make deep copies of expressions, ** expression lists, ID lists, and select statements. The copies can @@ -1497,6 +1537,7 @@ Select *sqlite3SelectDup(sqlite3 *db, Select *pDup, int flags){ #ifndef SQLITE_OMIT_WINDOWFUNC pNew->pWin = 0; pNew->pWinDefn = sqlite3WindowListDup(db, p->pWinDefn); + if( p->pWin ) gatherSelectWindows(pNew); #endif pNew->selId = p->selId; *pp = pNew; @@ -1629,6 +1670,9 @@ ExprList *sqlite3ExprListAppendVector( } vector_append_error: + if( IN_RENAME_OBJECT ){ + sqlite3RenameExprUnmap(pParse, pExpr); + } sqlite3ExprDelete(db, pExpr); sqlite3IdListDelete(db, pColumns); return pList; @@ -1772,8 +1816,9 @@ int sqlite3SelectWalkFail(Walker *pWalker, Select *NotUsed){ */ int sqlite3ExprIdToTrueFalse(Expr *pExpr){ assert( pExpr->op==TK_ID || pExpr->op==TK_STRING ); - if( sqlite3StrICmp(pExpr->u.zToken, "true")==0 - || sqlite3StrICmp(pExpr->u.zToken, "false")==0 + if( !ExprHasProperty(pExpr, EP_Quoted) + && (sqlite3StrICmp(pExpr->u.zToken, "true")==0 + || sqlite3StrICmp(pExpr->u.zToken, "false")==0) ){ pExpr->op = TK_TRUEFALSE; return 1; @@ -2082,7 +2127,9 @@ int sqlite3ExprIsInteger(Expr *p, int *pValue){ */ int sqlite3ExprCanBeNull(const Expr *p){ u8 op; - while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ p = p->pLeft; } + while( p->op==TK_UPLUS || p->op==TK_UMINUS ){ + p = p->pLeft; + } op = p->op; if( op==TK_REGISTER ) op = p->op2; switch( op ){ @@ -2149,14 +2196,6 @@ int sqlite3IsRowid(const char *z){ if( sqlite3StrICmp(z, "OID")==0 ) return 1; return 0; } -#ifdef SQLITE_ENABLE_NORMALIZE -int sqlite3IsRowidN(const char *z, int n){ - if( sqlite3StrNICmp(z, "_ROWID_", n)==0 ) return 1; - if( sqlite3StrNICmp(z, "ROWID", n)==0 ) return 1; - if( sqlite3StrNICmp(z, "OID", n)==0 ) return 1; - return 0; -} -#endif /* ** pX is the RHS of an IN operator. If pX is a SELECT statement @@ -2326,7 +2365,8 @@ int sqlite3FindInIndex( Expr *pX, /* The right-hand side (RHS) of the IN operator */ u32 inFlags, /* IN_INDEX_LOOP, _MEMBERSHIP, and/or _NOOP_OK */ int *prRhsHasNull, /* Register holding NULL status. See notes */ - int *aiMap /* Mapping from Index fields to RHS fields */ + int *aiMap, /* Mapping from Index fields to RHS fields */ + int *piTab /* OUT: index to use */ ){ Select *p; /* SELECT to the right of IN operator */ int eType = 0; /* Type of RHS table. IN_INDEX_* */ @@ -2421,6 +2461,7 @@ int sqlite3FindInIndex( Bitmask colUsed; /* Columns of the index used */ Bitmask mCol; /* Mask for the current column */ if( pIdx->nColumnpPartIdxWhere!=0 ) continue; /* Maximum nColumn is BMS-2, not BMS-1, so that we can compute ** BITMASK(nExpr) without overflowing */ testcase( pIdx->nColumn==BMS-2 ); @@ -2517,10 +2558,12 @@ int sqlite3FindInIndex( }else if( prRhsHasNull ){ *prRhsHasNull = rMayHaveNull = ++pParse->nMem; } - sqlite3CodeSubselect(pParse, pX, rMayHaveNull, eType==IN_INDEX_ROWID); + assert( pX->op==TK_IN ); + sqlite3CodeRhsOfIN(pParse, pX, iTab, eType==IN_INDEX_ROWID); + if( rMayHaveNull ){ + sqlite3SetHasNullFlag(v, iTab, rMayHaveNull); + } pParse->nQueryLoop = savedNQueryLoop; - }else{ - pX->iTable = iTab; } if( aiMap && eType!=IN_INDEX_INDEX_ASC && eType!=IN_INDEX_INDEX_DESC ){ @@ -2528,6 +2571,7 @@ int sqlite3FindInIndex( n = sqlite3ExprVectorSize(pX->pLeft); for(i=0; iiTable, +** however the cursor number returned might not be the same, as it might +** have been duplicated using OP_OpenDup. ** -** If parameter isRowid is non-zero, then expression pExpr is guaranteed -** to be of the form " IN (?, ?, ?)", where is a reference -** to some integer key column of a table B-Tree. In this case, use an -** intkey B-Tree to store the set of IN(...) values instead of the usual -** (slower) variable length keys B-Tree. +** If parameter isRowid is non-zero, then LHS of the IN operator is guaranteed +** to be a non-null integer. In this case, the ephemeral table can be an +** table B-Tree that keyed by only integers. The more general cases uses +** an index B-Tree which can have arbitrary keys, but is slower to both +** read and write. ** -** If rMayHaveNull is non-zero, that means that the operation is an IN -** (not a SELECT or EXISTS) and that the RHS might contains NULLs. -** All this routine does is initialize the register given by rMayHaveNull -** to NULL. Calling routines will take care of changing this register -** value to non-NULL if the RHS is NULL-free. +** If the LHS expression ("x" in the examples) is a column value, or +** the SELECT statement returns a column value, then the affinity of that +** column is used to build the index keys. If both 'x' and the +** SELECT... statement are columns, then numeric affinity is used +** if either column has NUMERIC or INTEGER affinity. If neither +** 'x' nor the SELECT... statement are columns, then numeric affinity +** is used. +*/ +void sqlite3CodeRhsOfIN( + Parse *pParse, /* Parsing context */ + Expr *pExpr, /* The IN operator */ + int iTab, /* Use this cursor number */ + int isRowid /* If true, LHS is a rowid */ +){ + int addrOnce = 0; /* Address of the OP_Once instruction at top */ + int addr; /* Address of OP_OpenEphemeral instruction */ + Expr *pLeft; /* the LHS of the IN operator */ + KeyInfo *pKeyInfo = 0; /* Key information */ + int nVal; /* Size of vector pLeft */ + Vdbe *v; /* The prepared statement under construction */ + + v = pParse->pVdbe; + assert( v!=0 ); + + /* The evaluation of the IN must be repeated every time it + ** is encountered if any of the following is true: + ** + ** * The right-hand side is a correlated subquery + ** * The right-hand side is an expression list containing variables + ** * We are inside a trigger + ** + ** If all of the above are false, then we can compute the RHS just once + ** and reuse it many names. + */ + if( !ExprHasProperty(pExpr, EP_VarSelect) && pParse->iSelfTab==0 ){ + /* Reuse of the RHS is allowed */ + /* If this routine has already been coded, but the previous code + ** might not have been invoked yet, so invoke it now as a subroutine. + */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + ExplainQueryPlan((pParse, 0, "REUSE LIST SUBQUERY %d", + pExpr->x.pSelect->selId)); + } + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + sqlite3VdbeAddOp2(v, OP_OpenDup, iTab, pExpr->iTable); + sqlite3VdbeJumpHere(v, addrOnce); + return; + } + + /* Begin coding the subroutine */ + ExprSetProperty(pExpr, EP_Subrtn); + pExpr->y.sub.regReturn = ++pParse->nMem; + pExpr->y.sub.iAddr = + sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; + VdbeComment((v, "return address")); + + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); + } + + /* Check to see if this is a vector IN operator */ + pLeft = pExpr->pLeft; + nVal = sqlite3ExprVectorSize(pLeft); + assert( !isRowid || nVal==1 ); + + /* Construct the ephemeral table that will contain the content of + ** RHS of the IN operator. + */ + pExpr->iTable = iTab; + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, + pExpr->iTable, (isRowid?0:nVal)); +#ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + VdbeComment((v, "Result of SELECT %u", pExpr->x.pSelect->selId)); + }else{ + VdbeComment((v, "RHS of IN operator")); + } +#endif + pKeyInfo = isRowid ? 0 : sqlite3KeyInfoAlloc(pParse->db, nVal, 1); + + if( ExprHasProperty(pExpr, EP_xIsSelect) ){ + /* Case 1: expr IN (SELECT ...) + ** + ** Generate code to write the results of the select into the temporary + ** table allocated and opened above. + */ + Select *pSelect = pExpr->x.pSelect; + ExprList *pEList = pSelect->pEList; + + ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY %d", + addrOnce?"":"CORRELATED ", pSelect->selId + )); + assert( !isRowid ); + /* If the LHS and RHS of the IN operator do not match, that + ** error will have been caught long before we reach this point. */ + if( ALWAYS(pEList->nExpr==nVal) ){ + SelectDest dest; + int i; + sqlite3SelectDestInit(&dest, SRT_Set, iTab); + dest.zAffSdst = exprINAffinity(pParse, pExpr); + pSelect->iLimit = 0; + testcase( pSelect->selFlags & SF_Distinct ); + testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ + if( sqlite3Select(pParse, pSelect, &dest) ){ + sqlite3DbFree(pParse->db, dest.zAffSdst); + sqlite3KeyInfoUnref(pKeyInfo); + return; + } + sqlite3DbFree(pParse->db, dest.zAffSdst); + assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ + assert( pEList!=0 ); + assert( pEList->nExpr>0 ); + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + for(i=0; iaColl[i] = sqlite3BinaryCompareCollSeq( + pParse, p, pEList->a[i].pExpr + ); + } + } + }else if( ALWAYS(pExpr->x.pList!=0) ){ + /* Case 2: expr IN (exprlist) + ** + ** For each expression, build an index key from the evaluation and + ** store it in the temporary table. If is a column, then use + ** that columns affinity when building index keys. If is not + ** a column, use numeric affinity. + */ + char affinity; /* Affinity of the LHS of the IN */ + int i; + ExprList *pList = pExpr->x.pList; + struct ExprList_item *pItem; + int r1, r2, r3; + affinity = sqlite3ExprAffinity(pLeft); + if( !affinity ){ + affinity = SQLITE_AFF_BLOB; + } + if( pKeyInfo ){ + assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); + pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); + } + + /* Loop through each expression in . */ + r1 = sqlite3GetTempReg(pParse); + r2 = sqlite3GetTempReg(pParse); + if( isRowid ) sqlite3VdbeAddOp4(v, OP_Blob, 0, r2, 0, "", P4_STATIC); + for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ + Expr *pE2 = pItem->pExpr; + int iValToIns; + + /* If the expression is not constant then we will need to + ** disable the test that was generated above that makes sure + ** this code only executes once. Because for a non-constant + ** expression we need to rerun this code each time. + */ + if( addrOnce && !sqlite3ExprIsConstant(pE2) ){ + sqlite3VdbeChangeToNoop(v, addrOnce); + addrOnce = 0; + } + + /* Evaluate the expression and insert it into the temp table */ + if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){ + sqlite3VdbeAddOp3(v, OP_InsertInt, iTab, r2, iValToIns); + }else{ + r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); + if( isRowid ){ + sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, + sqlite3VdbeCurrentAddr(v)+2); + VdbeCoverage(v); + sqlite3VdbeAddOp3(v, OP_Insert, iTab, r2, r3); + }else{ + sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r3, 1); + } + } + } + sqlite3ReleaseTempReg(pParse, r1); + sqlite3ReleaseTempReg(pParse, r2); + } + if( pKeyInfo ){ + sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); + } + if( addrOnce ){ + sqlite3VdbeJumpHere(v, addrOnce); + /* Subroutine return */ + sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); + sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); + } +} +#endif /* SQLITE_OMIT_SUBQUERY */ + +/* +** Generate code for scalar subqueries used as a subquery expression +** or EXISTS operator: ** -** For a SELECT or EXISTS operator, return the register that holds the -** result. For a multi-column SELECT, the result is stored in a contiguous -** array of registers and the return value is the register of the left-most -** result column. Return 0 for IN operators or if an error occurs. +** (SELECT a FROM b) -- subquery +** EXISTS (SELECT a FROM b) -- EXISTS subquery +** +** The pExpr parameter is the SELECT or EXISTS operator to be coded. +** +** The register that holds the result. For a multi-column SELECT, +** the result is stored in a contiguous array of registers and the +** return value is the register of the left-most result column. +** Return 0 if an error occurs. */ #ifndef SQLITE_OMIT_SUBQUERY -int sqlite3CodeSubselect( - Parse *pParse, /* Parsing context */ - Expr *pExpr, /* The IN, SELECT, or EXISTS operator */ - int rHasNullFlag, /* Register that records whether NULLs exist in RHS */ - int isRowid /* If true, LHS of IN operator is a rowid */ -){ - int jmpIfDynamic = -1; /* One-time test address */ - int rReg = 0; /* Register storing resulting */ - Vdbe *v = sqlite3GetVdbe(pParse); - if( NEVER(v==0) ) return 0; +int sqlite3CodeSubselect(Parse *pParse, Expr *pExpr){ + int addrOnce = 0; /* Address of OP_Once at top of subroutine */ + int rReg = 0; /* Register storing resulting */ + Select *pSel; /* SELECT statement to encode */ + SelectDest dest; /* How to deal with SELECT result */ + int nReg; /* Registers to allocate */ + Expr *pLimit; /* New limit expression */ - /* The evaluation of the IN/EXISTS/SELECT must be repeated every time it + Vdbe *v = pParse->pVdbe; + assert( v!=0 ); + testcase( pExpr->op==TK_EXISTS ); + testcase( pExpr->op==TK_SELECT ); + assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); + assert( ExprHasProperty(pExpr, EP_xIsSelect) ); + pSel = pExpr->x.pSelect; + + /* The evaluation of the EXISTS/SELECT must be repeated every time it ** is encountered if any of the following is true: ** ** * The right-hand side is a correlated subquery @@ -2653,208 +2901,70 @@ int sqlite3CodeSubselect( ** save the results, and reuse the same result on subsequent invocations. */ if( !ExprHasProperty(pExpr, EP_VarSelect) ){ - jmpIfDynamic = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); - } - - switch( pExpr->op ){ - case TK_IN: { - int addr; /* Address of OP_OpenEphemeral instruction */ - Expr *pLeft = pExpr->pLeft; /* the LHS of the IN operator */ - KeyInfo *pKeyInfo = 0; /* Key information */ - int nVal; /* Size of vector pLeft */ - - nVal = sqlite3ExprVectorSize(pLeft); - assert( !isRowid || nVal==1 ); - - /* Whether this is an 'x IN(SELECT...)' or an 'x IN()' - ** expression it is handled the same way. An ephemeral table is - ** filled with index keys representing the results from the - ** SELECT or the . - ** - ** If the 'x' expression is a column value, or the SELECT... - ** statement returns a column value, then the affinity of that - ** column is used to build the index keys. If both 'x' and the - ** SELECT... statement are columns, then numeric affinity is used - ** if either column has NUMERIC or INTEGER affinity. If neither - ** 'x' nor the SELECT... statement are columns, then numeric affinity - ** is used. - */ - pExpr->iTable = pParse->nTab++; - addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, - pExpr->iTable, (isRowid?0:nVal)); - pKeyInfo = isRowid ? 0 : sqlite3KeyInfoAlloc(pParse->db, nVal, 1); - - if( ExprHasProperty(pExpr, EP_xIsSelect) ){ - /* Case 1: expr IN (SELECT ...) - ** - ** Generate code to write the results of the select into the temporary - ** table allocated and opened above. - */ - Select *pSelect = pExpr->x.pSelect; - ExprList *pEList = pSelect->pEList; - - ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY", - jmpIfDynamic>=0?"":"CORRELATED " - )); - assert( !isRowid ); - /* If the LHS and RHS of the IN operator do not match, that - ** error will have been caught long before we reach this point. */ - if( ALWAYS(pEList->nExpr==nVal) ){ - SelectDest dest; - int i; - sqlite3SelectDestInit(&dest, SRT_Set, pExpr->iTable); - dest.zAffSdst = exprINAffinity(pParse, pExpr); - pSelect->iLimit = 0; - testcase( pSelect->selFlags & SF_Distinct ); - testcase( pKeyInfo==0 ); /* Caused by OOM in sqlite3KeyInfoAlloc() */ - if( sqlite3Select(pParse, pSelect, &dest) ){ - sqlite3DbFree(pParse->db, dest.zAffSdst); - sqlite3KeyInfoUnref(pKeyInfo); - return 0; - } - sqlite3DbFree(pParse->db, dest.zAffSdst); - assert( pKeyInfo!=0 ); /* OOM will cause exit after sqlite3Select() */ - assert( pEList!=0 ); - assert( pEList->nExpr>0 ); - assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); - for(i=0; iaColl[i] = sqlite3BinaryCompareCollSeq( - pParse, p, pEList->a[i].pExpr - ); - } - } - }else if( ALWAYS(pExpr->x.pList!=0) ){ - /* Case 2: expr IN (exprlist) - ** - ** For each expression, build an index key from the evaluation and - ** store it in the temporary table. If is a column, then use - ** that columns affinity when building index keys. If is not - ** a column, use numeric affinity. - */ - char affinity; /* Affinity of the LHS of the IN */ - int i; - ExprList *pList = pExpr->x.pList; - struct ExprList_item *pItem; - int r1, r2, r3; - affinity = sqlite3ExprAffinity(pLeft); - if( !affinity ){ - affinity = SQLITE_AFF_BLOB; - } - if( pKeyInfo ){ - assert( sqlite3KeyInfoIsWriteable(pKeyInfo) ); - pKeyInfo->aColl[0] = sqlite3ExprCollSeq(pParse, pExpr->pLeft); - } - - /* Loop through each expression in . */ - r1 = sqlite3GetTempReg(pParse); - r2 = sqlite3GetTempReg(pParse); - if( isRowid ) sqlite3VdbeAddOp4(v, OP_Blob, 0, r2, 0, "", P4_STATIC); - for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ - Expr *pE2 = pItem->pExpr; - int iValToIns; - - /* If the expression is not constant then we will need to - ** disable the test that was generated above that makes sure - ** this code only executes once. Because for a non-constant - ** expression we need to rerun this code each time. - */ - if( jmpIfDynamic>=0 && !sqlite3ExprIsConstant(pE2) ){ - sqlite3VdbeChangeToNoop(v, jmpIfDynamic); - jmpIfDynamic = -1; - } - - /* Evaluate the expression and insert it into the temp table */ - if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){ - sqlite3VdbeAddOp3(v, OP_InsertInt, pExpr->iTable, r2, iValToIns); - }else{ - r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); - if( isRowid ){ - sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, - sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_Insert, pExpr->iTable, r2, r3); - }else{ - sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, pExpr->iTable, r2, r3, 1); - } - } - } - sqlite3ReleaseTempReg(pParse, r1); - sqlite3ReleaseTempReg(pParse, r2); - } - if( pKeyInfo ){ - sqlite3VdbeChangeP4(v, addr, (void *)pKeyInfo, P4_KEYINFO); - } - break; + /* If this routine has already been coded, then invoke it as a + ** subroutine. */ + if( ExprHasProperty(pExpr, EP_Subrtn) ){ + ExplainQueryPlan((pParse, 0, "REUSE SUBQUERY %d", pSel->selId)); + sqlite3VdbeAddOp2(v, OP_Gosub, pExpr->y.sub.regReturn, + pExpr->y.sub.iAddr); + return pExpr->iTable; } - case TK_EXISTS: - case TK_SELECT: - default: { - /* Case 3: (SELECT ... FROM ...) - ** or: EXISTS(SELECT ... FROM ...) - ** - ** For a SELECT, generate code to put the values for all columns of - ** the first row into an array of registers and return the index of - ** the first register. - ** - ** If this is an EXISTS, write an integer 0 (not exists) or 1 (exists) - ** into a register and return that register number. - ** - ** In both cases, the query is augmented with "LIMIT 1". Any - ** preexisting limit is discarded in place of the new LIMIT 1. - */ - Select *pSel; /* SELECT statement to encode */ - SelectDest dest; /* How to deal with SELECT result */ - int nReg; /* Registers to allocate */ - Expr *pLimit; /* New limit expression */ + /* Begin coding the subroutine */ + ExprSetProperty(pExpr, EP_Subrtn); + pExpr->y.sub.regReturn = ++pParse->nMem; + pExpr->y.sub.iAddr = + sqlite3VdbeAddOp2(v, OP_Integer, 0, pExpr->y.sub.regReturn) + 1; + VdbeComment((v, "return address")); - testcase( pExpr->op==TK_EXISTS ); - testcase( pExpr->op==TK_SELECT ); - assert( pExpr->op==TK_EXISTS || pExpr->op==TK_SELECT ); - assert( ExprHasProperty(pExpr, EP_xIsSelect) ); - - pSel = pExpr->x.pSelect; - ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY", - jmpIfDynamic>=0?"":"CORRELATED ")); - nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1; - sqlite3SelectDestInit(&dest, 0, pParse->nMem+1); - pParse->nMem += nReg; - if( pExpr->op==TK_SELECT ){ - dest.eDest = SRT_Mem; - dest.iSdst = dest.iSDParm; - dest.nSdst = nReg; - sqlite3VdbeAddOp3(v, OP_Null, 0, dest.iSDParm, dest.iSDParm+nReg-1); - VdbeComment((v, "Init subquery result")); - }else{ - dest.eDest = SRT_Exists; - sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); - VdbeComment((v, "Init EXISTS result")); - } - pLimit = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[1], 0); - if( pSel->pLimit ){ - sqlite3ExprDelete(pParse->db, pSel->pLimit->pLeft); - pSel->pLimit->pLeft = pLimit; - }else{ - pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); - } - pSel->iLimit = 0; - if( sqlite3Select(pParse, pSel, &dest) ){ - return 0; - } - rReg = dest.iSDParm; - ExprSetVVAProperty(pExpr, EP_NoReduce); - break; - } + addrOnce = sqlite3VdbeAddOp0(v, OP_Once); VdbeCoverage(v); } - - if( rHasNullFlag ){ - sqlite3SetHasNullFlag(v, pExpr->iTable, rHasNullFlag); + + /* For a SELECT, generate code to put the values for all columns of + ** the first row into an array of registers and return the index of + ** the first register. + ** + ** If this is an EXISTS, write an integer 0 (not exists) or 1 (exists) + ** into a register and return that register number. + ** + ** In both cases, the query is augmented with "LIMIT 1". Any + ** preexisting limit is discarded in place of the new LIMIT 1. + */ + ExplainQueryPlan((pParse, 1, "%sSCALAR SUBQUERY %d", + addrOnce?"":"CORRELATED ", pSel->selId)); + nReg = pExpr->op==TK_SELECT ? pSel->pEList->nExpr : 1; + sqlite3SelectDestInit(&dest, 0, pParse->nMem+1); + pParse->nMem += nReg; + if( pExpr->op==TK_SELECT ){ + dest.eDest = SRT_Mem; + dest.iSdst = dest.iSDParm; + dest.nSdst = nReg; + sqlite3VdbeAddOp3(v, OP_Null, 0, dest.iSDParm, dest.iSDParm+nReg-1); + VdbeComment((v, "Init subquery result")); + }else{ + dest.eDest = SRT_Exists; + sqlite3VdbeAddOp2(v, OP_Integer, 0, dest.iSDParm); + VdbeComment((v, "Init EXISTS result")); } + pLimit = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[1], 0); + if( pSel->pLimit ){ + sqlite3ExprDelete(pParse->db, pSel->pLimit->pLeft); + pSel->pLimit->pLeft = pLimit; + }else{ + pSel->pLimit = sqlite3PExpr(pParse, TK_LIMIT, pLimit, 0); + } + pSel->iLimit = 0; + if( sqlite3Select(pParse, pSel, &dest) ){ + return 0; + } + pExpr->iTable = rReg = dest.iSDParm; + ExprSetVVAProperty(pExpr, EP_NoReduce); + if( addrOnce ){ + sqlite3VdbeJumpHere(v, addrOnce); - if( jmpIfDynamic>=0 ){ - sqlite3VdbeJumpHere(v, jmpIfDynamic); + /* Subroutine return */ + sqlite3VdbeAddOp1(v, OP_Return, pExpr->y.sub.regReturn); + sqlite3VdbeChangeP1(v, pExpr->y.sub.iAddr-1, sqlite3VdbeCurrentAddr(v)-1); } return rReg; @@ -2931,6 +3041,7 @@ static void sqlite3ExprCodeIN( int addrTruthOp; /* Address of opcode that determines the IN is true */ int destNotNull; /* Jump here if a comparison is not true in step 6 */ int addrTop; /* Top of the step-6 loop */ + int iTab = 0; /* Index to use */ pLeft = pExpr->pLeft; if( sqlite3ExprCheckIN(pParse, pExpr) ) return; @@ -2942,7 +3053,7 @@ static void sqlite3ExprCodeIN( if( pParse->db->mallocFailed ) goto sqlite3ExprCodeIN_oom_error; /* Attempt to compute the RHS. After this step, if anything other than - ** IN_INDEX_NOOP is returned, the table opened ith cursor pExpr->iTable + ** IN_INDEX_NOOP is returned, the table opened with cursor iTab ** contains the values that make up the RHS. If IN_INDEX_NOOP is returned, ** the RHS has not yet been coded. */ v = pParse->pVdbe; @@ -2950,7 +3061,8 @@ static void sqlite3ExprCodeIN( VdbeNoopComment((v, "begin IN expr")); eType = sqlite3FindInIndex(pParse, pExpr, IN_INDEX_MEMBERSHIP | IN_INDEX_NOOP_OK, - destIfFalse==destIfNull ? 0 : &rRhsHasNull, aiMap); + destIfFalse==destIfNull ? 0 : &rRhsHasNull, + aiMap, &iTab); assert( pParse->nErr || nVector==1 || eType==IN_INDEX_EPH || eType==IN_INDEX_INDEX_ASC || eType==IN_INDEX_INDEX_DESC @@ -2996,7 +3108,7 @@ static void sqlite3ExprCodeIN( if( eType==IN_INDEX_NOOP ){ ExprList *pList = pExpr->x.pList; CollSeq *pColl = sqlite3ExprCollSeq(pParse, pExpr->pLeft); - int labelOk = sqlite3VdbeMakeLabel(v); + int labelOk = sqlite3VdbeMakeLabel(pParse); int r2, regToFree; int regCkNull = 0; int ii; @@ -3040,7 +3152,7 @@ static void sqlite3ExprCodeIN( if( destIfNull==destIfFalse ){ destStep2 = destIfFalse; }else{ - destStep2 = destStep6 = sqlite3VdbeMakeLabel(v); + destStep2 = destStep6 = sqlite3VdbeMakeLabel(pParse); } for(i=0; ipLeft, i); @@ -3058,19 +3170,19 @@ static void sqlite3ExprCodeIN( /* In this case, the RHS is the ROWID of table b-tree and so we also ** know that the RHS is non-NULL. Hence, we combine steps 3 and 4 ** into a single opcode. */ - sqlite3VdbeAddOp3(v, OP_SeekRowid, pExpr->iTable, destIfFalse, rLhs); + sqlite3VdbeAddOp3(v, OP_SeekRowid, iTab, destIfFalse, rLhs); VdbeCoverage(v); addrTruthOp = sqlite3VdbeAddOp0(v, OP_Goto); /* Return True */ }else{ sqlite3VdbeAddOp4(v, OP_Affinity, rLhs, nVector, 0, zAff, nVector); if( destIfFalse==destIfNull ){ /* Combine Step 3 and Step 5 into a single opcode */ - sqlite3VdbeAddOp4Int(v, OP_NotFound, pExpr->iTable, destIfFalse, + sqlite3VdbeAddOp4Int(v, OP_NotFound, iTab, destIfFalse, rLhs, nVector); VdbeCoverage(v); goto sqlite3ExprCodeIN_finished; } /* Ordinary Step 3, for the case where FALSE and NULL are distinct */ - addrTruthOp = sqlite3VdbeAddOp4Int(v, OP_Found, pExpr->iTable, 0, + addrTruthOp = sqlite3VdbeAddOp4Int(v, OP_Found, iTab, 0, rLhs, nVector); VdbeCoverage(v); } @@ -3095,10 +3207,10 @@ static void sqlite3ExprCodeIN( ** of the RHS. */ if( destStep6 ) sqlite3VdbeResolveLabel(v, destStep6); - addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, pExpr->iTable, destIfFalse); + addrTop = sqlite3VdbeAddOp2(v, OP_Rewind, iTab, destIfFalse); VdbeCoverage(v); if( nVector>1 ){ - destNotNull = sqlite3VdbeMakeLabel(v); + destNotNull = sqlite3VdbeMakeLabel(pParse); }else{ /* For nVector==1, combine steps 6 and 7 by immediately returning ** FALSE if the first comparison is not NULL */ @@ -3110,7 +3222,7 @@ static void sqlite3ExprCodeIN( int r3 = sqlite3GetTempReg(pParse); p = sqlite3VectorFieldSubexpr(pLeft, i); pColl = sqlite3ExprCollSeq(pParse, p); - sqlite3VdbeAddOp3(v, OP_Column, pExpr->iTable, i, r3); + sqlite3VdbeAddOp3(v, OP_Column, iTab, i, r3); sqlite3VdbeAddOp4(v, OP_Ne, rLhs+i, destNotNull, r3, (void*)pColl, P4_COLLSEQ); VdbeCoverage(v); @@ -3119,7 +3231,7 @@ static void sqlite3ExprCodeIN( sqlite3VdbeAddOp2(v, OP_Goto, 0, destIfNull); if( nVector>1 ){ sqlite3VdbeResolveLabel(v, destNotNull); - sqlite3VdbeAddOp2(v, OP_Next, pExpr->iTable, addrTop+1); + sqlite3VdbeAddOp2(v, OP_Next, iTab, addrTop+1); VdbeCoverage(v); /* Step 7: If we reach this point, we know that the result must @@ -3318,7 +3430,7 @@ static int exprCodeVector(Parse *pParse, Expr *p, int *piFreeable){ #if SQLITE_OMIT_SUBQUERY iResult = 0; #else - iResult = sqlite3CodeSubselect(pParse, p, 0, 0); + iResult = sqlite3CodeSubselect(pParse, p); #endif }else{ int i; @@ -3663,7 +3775,7 @@ expr_code_doover: ** arguments past the first non-NULL argument. */ if( pDef->funcFlags & SQLITE_FUNC_COALESCE ){ - int endCoalesce = sqlite3VdbeMakeLabel(v); + int endCoalesce = sqlite3VdbeMakeLabel(pParse); assert( nFarg>=2 ); sqlite3ExprCode(pParse, pFarg->a[0].pExpr, target); for(i=1; ix.pSelect->pEList->nExpr)!=1 ){ sqlite3SubselectError(pParse, nCol, 1); }else{ - return sqlite3CodeSubselect(pParse, pExpr, 0, 0); + return sqlite3CodeSubselect(pParse, pExpr); } break; } case TK_SELECT_COLUMN: { int n; if( pExpr->pLeft->iTable==0 ){ - pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft, 0, 0); + pExpr->pLeft->iTable = sqlite3CodeSubselect(pParse, pExpr->pLeft); } assert( pExpr->iTable==0 || pExpr->pLeft->op==TK_SELECT ); if( pExpr->iTable @@ -3811,8 +3923,8 @@ expr_code_doover: return pExpr->pLeft->iTable + pExpr->iColumn; } case TK_IN: { - int destIfFalse = sqlite3VdbeMakeLabel(v); - int destIfNull = sqlite3VdbeMakeLabel(v); + int destIfFalse = sqlite3VdbeMakeLabel(pParse); + int destIfNull = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_Null, 0, target); sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); sqlite3VdbeAddOp2(v, OP_Integer, 1, target); @@ -3952,9 +4064,9 @@ expr_code_doover: pEList = pExpr->x.pList; aListelem = pEList->a; nExpr = pEList->nExpr; - endLabel = sqlite3VdbeMakeLabel(v); + endLabel = sqlite3VdbeMakeLabel(pParse); if( (pX = pExpr->pLeft)!=0 ){ - tempX = *pX; + exprNodeCopy(&tempX, pX); testcase( pX->op==TK_COLUMN ); exprToRegister(&tempX, exprCodeVector(pParse, &tempX, ®Free1)); testcase( regFree1==0 ); @@ -3975,7 +4087,7 @@ expr_code_doover: }else{ pTest = aListelem[i].pExpr; } - nextCase = sqlite3VdbeMakeLabel(v); + nextCase = sqlite3VdbeMakeLabel(pParse); testcase( pTest->op==TK_COLUMN ); sqlite3ExprIfFalse(pParse, pTest, nextCase, SQLITE_JUMPIFNULL); testcase( aListelem[i+1].pExpr->op==TK_COLUMN ); @@ -4275,13 +4387,12 @@ static void exprCodeBetween( Expr exprX; /* The x subexpression */ int regFree1 = 0; /* Temporary use register */ - memset(&compLeft, 0, sizeof(Expr)); memset(&compRight, 0, sizeof(Expr)); memset(&exprAnd, 0, sizeof(Expr)); assert( !ExprHasProperty(pExpr, EP_xIsSelect) ); - exprX = *pExpr->pLeft; + exprNodeCopy(&exprX, pExpr->pLeft); exprAnd.op = TK_AND; exprAnd.pLeft = &compLeft; exprAnd.pRight = &compRight; @@ -4344,7 +4455,7 @@ void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ op = pExpr->op; switch( op ){ case TK_AND: { - int d2 = sqlite3VdbeMakeLabel(v); + int d2 = sqlite3VdbeMakeLabel(pParse); testcase( jumpIfNull==0 ); sqlite3ExprIfFalse(pParse, pExpr->pLeft, d2,jumpIfNull^SQLITE_JUMPIFNULL); sqlite3ExprIfTrue(pParse, pExpr->pRight, dest, jumpIfNull); @@ -4430,7 +4541,7 @@ void sqlite3ExprIfTrue(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ } #ifndef SQLITE_OMIT_SUBQUERY case TK_IN: { - int destIfFalse = sqlite3VdbeMakeLabel(v); + int destIfFalse = sqlite3VdbeMakeLabel(pParse); int destIfNull = jumpIfNull ? dest : destIfFalse; sqlite3ExprCodeIN(pParse, pExpr, destIfFalse, destIfNull); sqlite3VdbeGoto(v, dest); @@ -4517,7 +4628,7 @@ void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ break; } case TK_OR: { - int d2 = sqlite3VdbeMakeLabel(v); + int d2 = sqlite3VdbeMakeLabel(pParse); testcase( jumpIfNull==0 ); sqlite3ExprIfTrue(pParse, pExpr->pLeft, d2, jumpIfNull^SQLITE_JUMPIFNULL); sqlite3ExprIfFalse(pParse, pExpr->pRight, dest, jumpIfNull); @@ -4601,7 +4712,7 @@ void sqlite3ExprIfFalse(Parse *pParse, Expr *pExpr, int dest, int jumpIfNull){ if( jumpIfNull ){ sqlite3ExprCodeIN(pParse, pExpr, dest, dest); }else{ - int destIfNull = sqlite3VdbeMakeLabel(v); + int destIfNull = sqlite3VdbeMakeLabel(pParse); sqlite3ExprCodeIN(pParse, pExpr, dest, destIfNull); sqlite3VdbeResolveLabel(v, destIfNull); } @@ -4722,7 +4833,7 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ } return 2; } - if( pA->op!=pB->op ){ + if( pA->op!=pB->op || pA->op==TK_RAISE ){ if( pA->op==TK_COLLATE && sqlite3ExprCompare(pParse, pA->pLeft,pB,iTab)<2 ){ return 1; } @@ -4748,21 +4859,25 @@ int sqlite3ExprCompare(Parse *pParse, Expr *pA, Expr *pB, int iTab){ if( sqlite3WindowCompare(pParse,pA->y.pWin,pB->y.pWin)!=0 ) return 2; } #endif + }else if( pA->op==TK_NULL ){ + return 0; }else if( pA->op==TK_COLLATE ){ if( sqlite3_stricmp(pA->u.zToken,pB->u.zToken)!=0 ) return 2; - }else if( strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ + }else if( ALWAYS(pB->u.zToken!=0) && strcmp(pA->u.zToken,pB->u.zToken)!=0 ){ return 2; } } if( (pA->flags & EP_Distinct)!=(pB->flags & EP_Distinct) ) return 2; - if( ALWAYS((combinedFlags & EP_TokenOnly)==0) ){ + if( (combinedFlags & EP_TokenOnly)==0 ){ if( combinedFlags & EP_xIsSelect ) return 2; if( (combinedFlags & EP_FixedCol)==0 && sqlite3ExprCompare(pParse, pA->pLeft, pB->pLeft, iTab) ) return 2; if( sqlite3ExprCompare(pParse, pA->pRight, pB->pRight, iTab) ) return 2; if( sqlite3ExprListCompare(pA->x.pList, pB->x.pList, iTab) ) return 2; - assert( (combinedFlags & EP_Reduced)==0 ); - if( pA->op!=TK_STRING && pA->op!=TK_TRUEFALSE ){ + if( pA->op!=TK_STRING + && pA->op!=TK_TRUEFALSE + && (combinedFlags & EP_Reduced)==0 + ){ if( pA->iColumn!=pB->iColumn ) return 2; if( pA->iTable!=pB->iTable && (pA->iTable!=iTab || NEVER(pB->iTable>=0)) ) return 2; @@ -4871,6 +4986,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ case TK_ISNOT: case TK_NOT: case TK_ISNULL: + case TK_NOTNULL: case TK_IS: case TK_OR: case TK_CASE: @@ -4879,6 +4995,7 @@ static int impliesNotNullRow(Walker *pWalker, Expr *pExpr){ testcase( pExpr->op==TK_ISNOT ); testcase( pExpr->op==TK_NOT ); testcase( pExpr->op==TK_ISNULL ); + testcase( pExpr->op==TK_NOTNULL ); testcase( pExpr->op==TK_IS ); testcase( pExpr->op==TK_OR ); testcase( pExpr->op==TK_CASE ); @@ -5252,6 +5369,7 @@ void sqlite3ExprAnalyzeAggregates(NameContext *pNC, Expr *pExpr){ w.xSelectCallback2 = analyzeAggregatesInSelectEnd; w.walkerDepth = 0; w.u.pNC = pNC; + w.pParse = 0; assert( pNC->pSrcList!=0 ); sqlite3WalkExpr(&w, pExpr); } diff --git a/src/fkey.c b/src/fkey.c index 6777d71..9633c41 100644 --- a/src/fkey.c +++ b/src/fkey.c @@ -329,7 +329,7 @@ static void fkLookupParent( int i; /* Iterator variable */ Vdbe *v = sqlite3GetVdbe(pParse); /* Vdbe to add code to */ int iCur = pParse->nTab - 1; /* Cursor number to use */ - int iOk = sqlite3VdbeMakeLabel(v); /* jump here if parent key found */ + int iOk = sqlite3VdbeMakeLabel(pParse); /* jump here if parent key found */ sqlite3VdbeVerifyAbortable(v, (!pFKey->isDeferred @@ -602,8 +602,11 @@ static void fkScanChildren( ** NOT( $current_a==a AND $current_b==b AND ... ) ** ** The first form is used for rowid tables. The second form is used - ** for WITHOUT ROWID tables. In the second form, the primary key is - ** (a,b,...) + ** for WITHOUT ROWID tables. In the second form, the *parent* key is + ** (a,b,...). Either the parent or primary key could be used to + ** uniquely identify the current row, but the parent key is more convenient + ** as the required values have already been loaded into registers + ** by the caller. */ if( pTab==pFKey->pFrom && nIncr>0 ){ Expr *pNe; /* Expression (pLeft != pRight) */ @@ -615,14 +618,13 @@ static void fkScanChildren( pNe = sqlite3PExpr(pParse, TK_NE, pLeft, pRight); }else{ Expr *pEq, *pAll = 0; - Index *pPk = sqlite3PrimaryKeyIndex(pTab); assert( pIdx!=0 ); - for(i=0; inKeyCol; i++){ + for(i=0; inKeyCol; i++){ i16 iCol = pIdx->aiColumn[i]; assert( iCol>=0 ); pLeft = exprTableRegister(pParse, pTab, regData, iCol); - pRight = exprTableColumn(db, pTab, pSrc->a[0].iCursor, iCol); - pEq = sqlite3PExpr(pParse, TK_EQ, pLeft, pRight); + pRight = sqlite3Expr(db, TK_ID, pTab->aCol[iCol].zName); + pEq = sqlite3PExpr(pParse, TK_IS, pLeft, pRight); pAll = sqlite3ExprAnd(db, pAll, pEq); } pNe = sqlite3PExpr(pParse, TK_NOT, pAll, 0); @@ -727,7 +729,7 @@ void sqlite3FkDropTable(Parse *pParse, SrcList *pName, Table *pTab){ if( p->isDeferred || (db->flags & SQLITE_DeferFKs) ) break; } if( !p ) return; - iSkip = sqlite3VdbeMakeLabel(v); + iSkip = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_FkIfZero, 1, iSkip); VdbeCoverage(v); } @@ -1012,7 +1014,7 @@ void sqlite3FkCheck( /* Create a SrcList structure containing the child table. We need the ** child table as a SrcList for sqlite3WhereBegin() */ - pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pSrc ){ struct SrcList_item *pItem = pSrc->a; pItem->pTab = pFKey->pFrom; @@ -1289,7 +1291,7 @@ static Trigger *fkActionTrigger( } pSelect = sqlite3SelectNew(pParse, sqlite3ExprListAppend(pParse, 0, pRaise), - sqlite3SrcListAppend(db, 0, &tFrom, 0), + sqlite3SrcListAppend(pParse, 0, &tFrom, 0), pWhere, 0, 0, 0, 0, 0 ); diff --git a/src/func.c b/src/func.c index 0504a8f..8b1d441 100644 --- a/src/func.c +++ b/src/func.c @@ -201,6 +201,7 @@ static void instrFunc( int typeHaystack, typeNeedle; int N = 1; int isText; + unsigned char firstChar; UNUSED_PARAMETER(argc); typeHaystack = sqlite3_value_type(argv[0]); @@ -219,7 +220,10 @@ static void instrFunc( isText = 1; } if( zNeedle==0 || (nHaystack && zHaystack==0) ) return; - while( nNeedle<=nHaystack && memcmp(zHaystack, zNeedle, nNeedle)!=0 ){ + firstChar = zNeedle[0]; + while( nNeedle<=nHaystack + && (zHaystack[0]!=firstChar || memcmp(zHaystack, zNeedle, nNeedle)!=0) + ){ N++; do{ nHaystack--; @@ -510,11 +514,11 @@ static void randomBlob( int argc, sqlite3_value **argv ){ - int n; + sqlite3_int64 n; unsigned char *p; assert( argc==1 ); UNUSED_PARAMETER(argc); - n = sqlite3_value_int(argv[0]); + n = sqlite3_value_int64(argv[0]); if( n<1 ){ n = 1; } diff --git a/src/global.c b/src/global.c index f1a3912..a78ea65 100644 --- a/src/global.c +++ b/src/global.c @@ -189,6 +189,13 @@ const unsigned char sqlite3CtypeMap[256] = { #endif +/* The default maximum size of an in-memory database created using +** sqlite3_deserialize() +*/ +#ifndef SQLITE_MEMDB_DEFAULT_MAXSIZE +# define SQLITE_MEMDB_DEFAULT_MAXSIZE 1073741824 +#endif + /* ** The following singleton contains the global configuration for ** the SQLite library. @@ -236,13 +243,16 @@ SQLITE_WSD struct Sqlite3Config sqlite3Config = { 0, /* xVdbeBranch */ 0, /* pVbeBranchArg */ #endif +#ifdef SQLITE_ENABLE_DESERIALIZE + SQLITE_MEMDB_DEFAULT_MAXSIZE, /* mxMemdbSize */ +#endif #ifndef SQLITE_UNTESTABLE 0, /* xTestCallback */ #endif 0, /* bLocaltimeFault */ 0, /* bInternalFunctions */ 0x7ffffffe, /* iOnceResetThreshold */ - SQLITE_DEFAULT_SORTERREF_SIZE /* szSorterRef */ + SQLITE_DEFAULT_SORTERREF_SIZE, /* szSorterRef */ }; /* diff --git a/src/hash.c b/src/hash.c index fba9dc9..79bb85a 100644 --- a/src/hash.c +++ b/src/hash.c @@ -64,20 +64,6 @@ static unsigned int strHash(const char *z){ } return h; } -#ifdef SQLITE_ENABLE_NORMALIZE -static unsigned int strHashN(const char *z, int n){ - unsigned int h = 0; - int i; - for(i=0; iht ){ /*OPTIMIZATION-IF-TRUE*/ - struct _ht *pEntry; - h = strHashN(pKey, nKey) % pH->htsize; - pEntry = &pH->ht[h]; - elem = pEntry->chain; - count = pEntry->count; - }else{ - h = 0; - elem = pH->first; - count = pH->count; - } - if( pHash ) *pHash = h; - while( count-- ){ - assert( elem!=0 ); - if( sqlite3StrNICmp(elem->pKey,pKey,nKey)==0 ){ - return elem; - } - elem = elem->next; - } - return &nullElement; -} -#endif /* SQLITE_ENABLE_NORMALIZE */ /* Remove a single entry from the hash table given a pointer to that ** element and a hash on the element's key. @@ -267,14 +219,6 @@ void *sqlite3HashFind(const Hash *pH, const char *pKey){ assert( pKey!=0 ); return findElementWithHash(pH, pKey, 0)->data; } -#ifdef SQLITE_ENABLE_NORMALIZE -void *sqlite3HashFindN(const Hash *pH, const char *pKey, int nKey){ - assert( pH!=0 ); - assert( pKey!=0 ); - assert( nKey>=0 ); - return findElementWithHashN(pH, pKey, nKey, 0)->data; -} -#endif /* SQLITE_ENABLE_NORMALIZE */ /* Insert an element into the hash table pH. The key is pKey ** and the data is "data". diff --git a/src/insert.c b/src/insert.c index 7a94139..a69e625 100644 --- a/src/insert.c +++ b/src/insert.c @@ -319,6 +319,7 @@ void sqlite3AutoincrementBegin(Parse *pParse){ aOp[7].p2 = memId+2; aOp[7].p1 = memId; aOp[10].p2 = memId; + if( pParse->nTab==0 ) pParse->nTab = 1; } } @@ -825,6 +826,11 @@ void sqlite3Insert( } #ifndef SQLITE_OMIT_UPSERT if( pUpsert ){ + if( IsVirtual(pTab) ){ + sqlite3ErrorMsg(pParse, "UPSERT not implemented for virtual table \"%s\"", + pTab->zName); + goto insert_cleanup; + } pTabList->a[0].iCursor = iDataCur; pUpsert->pUpsertSrc = pTabList; pUpsert->regData = regData; @@ -865,7 +871,7 @@ void sqlite3Insert( /* Run the BEFORE and INSTEAD OF triggers, if there are any */ - endOfLoop = sqlite3VdbeMakeLabel(v); + endOfLoop = sqlite3VdbeMakeLabel(pParse); if( tmask & TRIGGER_BEFORE ){ int regCols = sqlite3GetTempRange(pParse, pTab->nCol+1); @@ -947,16 +953,12 @@ void sqlite3Insert( }else if( pSelect ){ sqlite3VdbeAddOp2(v, OP_Copy, regFromSelect+ipkColumn, regRowid); }else{ - VdbeOp *pOp; - sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); - pOp = sqlite3VdbeGetOp(v, -1); - assert( pOp!=0 ); - if( pOp->opcode==OP_Null && !IsVirtual(pTab) ){ + Expr *pIpk = pList->a[ipkColumn].pExpr; + if( pIpk->op==TK_NULL && !IsVirtual(pTab) ){ + sqlite3VdbeAddOp3(v, OP_NewRowid, iDataCur, regRowid, regAutoinc); appendFlag = 1; - pOp->opcode = OP_NewRowid; - pOp->p1 = iDataCur; - pOp->p2 = regRowid; - pOp->p3 = regAutoinc; + }else{ + sqlite3ExprCode(pParse, pList->a[ipkColumn].pExpr, regRowid); } } /* If the PRIMARY KEY expression is NULL, then use OP_NewRowid @@ -1351,7 +1353,20 @@ void sqlite3GenerateConstraintChecks( } assert( onError==OE_Rollback || onError==OE_Abort || onError==OE_Fail || onError==OE_Ignore || onError==OE_Replace ); + addr1 = 0; switch( onError ){ + case OE_Replace: { + assert( onError==OE_Replace ); + addr1 = sqlite3VdbeMakeLabel(pParse); + sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, addr1); + VdbeCoverage(v); + sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); + sqlite3VdbeAddOp2(v, OP_NotNull, regNewData+1+i, 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 */ @@ -1364,19 +1379,13 @@ void sqlite3GenerateConstraintChecks( sqlite3VdbeAppendP4(v, zMsg, P4_DYNAMIC); sqlite3VdbeChangeP5(v, P5_ConstraintNotNull); VdbeCoverage(v); - break; - } - case OE_Ignore: { - sqlite3VdbeAddOp2(v, OP_IsNull, regNewData+1+i, ignoreDest); - VdbeCoverage(v); + if( addr1 ) sqlite3VdbeResolveLabel(v, addr1); break; } default: { - assert( onError==OE_Replace ); - addr1 = sqlite3VdbeAddOp1(v, OP_NotNull, regNewData+1+i); - VdbeCoverage(v); - sqlite3ExprCode(pParse, pTab->aCol[i].pDflt, regNewData+1+i); - sqlite3VdbeJumpHere(v, addr1); + assert( onError==OE_Ignore ); + sqlite3VdbeAddOp2(v, OP_IsNull, regNewData+1+i, ignoreDest); + VdbeCoverage(v); break; } } @@ -1399,7 +1408,7 @@ void sqlite3GenerateConstraintChecks( ** updated so there is no point it verifying the check constraint */ continue; } - allOk = sqlite3VdbeMakeLabel(v); + allOk = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeVerifyAbortable(v, onError); sqlite3ExprIfTrue(pParse, pExpr, allOk, SQLITE_JUMPIFNULL); if( onError==OE_Ignore ){ @@ -1466,7 +1475,7 @@ void sqlite3GenerateConstraintChecks( ** exist in the table. */ if( pkChng && pPk==0 ){ - int addrRowidOk = sqlite3VdbeMakeLabel(v); + int addrRowidOk = sqlite3VdbeMakeLabel(pParse); /* Figure out what action to take in case of a rowid collision */ onError = pTab->keyConf; @@ -1616,7 +1625,7 @@ void sqlite3GenerateConstraintChecks( VdbeComment((v, "Skip upsert subroutine")); sqlite3VdbeJumpHere(v, upsertJump); }else{ - addrUniqueOk = sqlite3VdbeMakeLabel(v); + addrUniqueOk = sqlite3VdbeMakeLabel(pParse); } if( bAffinityDone==0 && (pUpIdx==0 || pUpIdx==pIdx) ){ sqlite3TableAffinity(v, pTab, regNewData+1); @@ -1699,7 +1708,11 @@ void sqlite3GenerateConstraintChecks( ** (3) There are no secondary indexes on the table ** (4) No delete triggers need to be fired if there is a conflict ** (5) No FK constraint counters need to be updated if a conflict occurs. - */ + ** + ** This is not possible for ENABLE_PREUPDATE_HOOK builds, as the row + ** must be explicitly deleted in order to ensure any pre-update hook + ** is invoked. */ +#ifndef SQLITE_ENABLE_PREUPDATE_HOOK if( (ix==0 && pIdx->pNext==0) /* Condition 3 */ && pPk==pIdx /* Condition 2 */ && onError==OE_Replace /* Condition 1 */ @@ -1711,6 +1724,7 @@ void sqlite3GenerateConstraintChecks( sqlite3VdbeResolveLabel(v, addrUniqueOk); continue; } +#endif /* ifndef SQLITE_ENABLE_PREUPDATE_HOOK */ /* Check to see if the new index entry will be unique */ sqlite3VdbeVerifyAbortable(v, onError); @@ -1824,7 +1838,7 @@ void sqlite3GenerateConstraintChecks( /* If the IPK constraint is a REPLACE, run it last */ if( ipkTop ){ - sqlite3VdbeGoto(v, ipkTop+1); + sqlite3VdbeGoto(v, ipkTop); VdbeComment((v, "Do IPK REPLACE")); sqlite3VdbeJumpHere(v, ipkBottom); } @@ -2194,7 +2208,8 @@ static int xferOptimization( if( pSrc==0 ){ return 0; /* FROM clause does not contain a real table */ } - if( pSrc==pDest ){ + if( pSrc->tnum==pDest->tnum && pSrc->pSchema==pDest->pSchema ){ + testcase( pSrc!=pDest ); /* Possible due to bad sqlite_master.rootpage */ return 0; /* tab1 and tab2 may not be the same table */ } if( HasRowid(pDest)!=HasRowid(pSrc) ){ diff --git a/src/legacy.c b/src/legacy.c index 40959a8..867587e 100644 --- a/src/legacy.c +++ b/src/legacy.c @@ -46,7 +46,7 @@ int sqlite3_exec( sqlite3_mutex_enter(db->mutex); sqlite3Error(db, SQLITE_OK); while( rc==SQLITE_OK && zSql[0] ){ - int nCol; + int nCol = 0; char **azVals = 0; pStmt = 0; @@ -60,9 +60,7 @@ int sqlite3_exec( zSql = zLeftover; continue; } - callbackIsInit = 0; - nCol = sqlite3_column_count(pStmt); while( 1 ){ int i; @@ -73,6 +71,7 @@ int sqlite3_exec( (SQLITE_DONE==rc && !callbackIsInit && db->flags&SQLITE_NullCallback)) ){ if( !callbackIsInit ){ + nCol = sqlite3_column_count(pStmt); azCols = sqlite3DbMallocRaw(db, (2*nCol+1)*sizeof(const char*)); if( azCols==0 ){ goto exec_out; diff --git a/src/loadext.c b/src/loadext.c index 966d2dd..214390e 100644 --- a/src/loadext.c +++ b/src/loadext.c @@ -650,7 +650,7 @@ int sqlite3_enable_load_extension(sqlite3 *db, int onoff){ if( onoff ){ db->flags |= SQLITE_LoadExtension|SQLITE_LoadExtFunc; }else{ - db->flags &= ~(SQLITE_LoadExtension|SQLITE_LoadExtFunc); + db->flags &= ~(u64)(SQLITE_LoadExtension|SQLITE_LoadExtFunc); } sqlite3_mutex_leave(db->mutex); return SQLITE_OK; diff --git a/src/main.c b/src/main.c index 46c8346..41e0245 100644 --- a/src/main.c +++ b/src/main.c @@ -653,6 +653,13 @@ int sqlite3_config(int op, ...){ } #endif /* SQLITE_ENABLE_SORTER_REFERENCES */ +#ifdef SQLITE_ENABLE_DESERIALIZE + case SQLITE_CONFIG_MEMDB_MAXSIZE: { + sqlite3GlobalConfig.mxMemdbSize = va_arg(ap, sqlite3_int64); + break; + } +#endif /* SQLITE_ENABLE_DESERIALIZE */ + default: { rc = SQLITE_ERROR; break; @@ -843,11 +850,11 @@ int sqlite3_db_config(sqlite3 *db, int op, ...){ if( aFlagOp[i].op==op ){ int onoff = va_arg(ap, int); int *pRes = va_arg(ap, int*); - u32 oldFlags = db->flags; + u64 oldFlags = db->flags; if( onoff>0 ){ db->flags |= aFlagOp[i].mask; }else if( onoff==0 ){ - db->flags &= ~aFlagOp[i].mask; + db->flags &= ~(u64)aFlagOp[i].mask; } if( oldFlags!=db->flags ){ sqlite3ExpirePreparedStatements(db, 0); @@ -1310,7 +1317,7 @@ void sqlite3RollbackAll(sqlite3 *db, int tripCode){ /* Any deferred constraint violations have now been resolved. */ db->nDeferredCons = 0; db->nDeferredImmCons = 0; - db->flags &= ~SQLITE_DeferFKs; + db->flags &= ~(u64)SQLITE_DeferFKs; /* If one has been configured, invoke the rollback-hook callback */ if( db->xRollbackCallback && (inTrans || !db->autoCommit) ){ @@ -2052,6 +2059,8 @@ void *sqlite3_profile( pOld = db->pProfileArg; db->xProfile = xProfile; db->pProfileArg = pArg; + db->mTrace &= SQLITE_TRACE_NONLEGACY_MASK; + if( db->xProfile ) db->mTrace |= SQLITE_TRACE_XPROFILE; sqlite3_mutex_leave(db->mutex); return pOld; } @@ -2403,7 +2412,7 @@ const char *sqlite3_errmsg(sqlite3 *db){ z = sqlite3ErrStr(SQLITE_NOMEM_BKPT); }else{ testcase( db->pErr==0 ); - z = (char*)sqlite3_value_text(db->pErr); + z = db->errCode ? (char*)sqlite3_value_text(db->pErr) : 0; assert( !db->mallocFailed ); if( z==0 ){ z = sqlite3ErrStr(db->errCode); @@ -2933,6 +2942,40 @@ int sqlite3ParseUri( return rc; } +#if defined(SQLITE_HAS_CODEC) +/* +** Process URI filename query parameters relevant to the SQLite Encryption +** Extension. Return true if any of the relevant query parameters are +** seen and return false if not. +*/ +int sqlite3CodecQueryParameters( + sqlite3 *db, /* Database connection */ + const char *zDb, /* Which schema is being created/attached */ + const char *zUri /* URI filename */ +){ + const char *zKey; + if( (zKey = sqlite3_uri_parameter(zUri, "hexkey"))!=0 && zKey[0] ){ + u8 iByte; + int i; + char zDecoded[40]; + for(i=0, iByte=0; imFlags & SQLITE_DESERIALIZE_RESIZEABLE)==0 || p->nMmap>0 ){ return SQLITE_FULL; } + if( newSz>p->szMax ){ + return SQLITE_FULL; + } + newSz *= 2; + if( newSz>p->szMax ) newSz = p->szMax; pNew = sqlite3_realloc64(p->aData, newSz); if( pNew==0 ) return SQLITE_NOMEM; p->aData = pNew; - p->szMax = newSz; + p->szAlloc = newSz; return SQLITE_OK; } @@ -177,10 +183,11 @@ static int memdbWrite( sqlite_int64 iOfst ){ MemFile *p = (MemFile *)pFile; + if( NEVER(p->mFlags & SQLITE_DESERIALIZE_READONLY) ) return SQLITE_READONLY; if( iOfst+iAmt>p->sz ){ int rc; - if( iOfst+iAmt>p->szMax - && (rc = memdbEnlarge(p, (iOfst+iAmt)*2))!=SQLITE_OK + if( iOfst+iAmt>p->szAlloc + && (rc = memdbEnlarge(p, iOfst+iAmt))!=SQLITE_OK ){ return rc; } @@ -226,6 +233,11 @@ static int memdbFileSize(sqlite3_file *pFile, sqlite_int64 *pSize){ */ static int memdbLock(sqlite3_file *pFile, int eLock){ MemFile *p = (MemFile *)pFile; + if( eLock>SQLITE_LOCK_SHARED + && (p->mFlags & SQLITE_DESERIALIZE_READONLY)!=0 + ){ + return SQLITE_READONLY; + } p->eLock = eLock; return SQLITE_OK; } @@ -250,6 +262,19 @@ static int memdbFileControl(sqlite3_file *pFile, int op, void *pArg){ *(char**)pArg = sqlite3_mprintf("memdb(%p,%lld)", p->aData, p->sz); rc = SQLITE_OK; } + if( op==SQLITE_FCNTL_SIZE_LIMIT ){ + sqlite3_int64 iLimit = *(sqlite3_int64*)pArg; + if( iLimitsz ){ + if( iLimit<0 ){ + iLimit = p->szMax; + }else{ + iLimit = p->sz; + } + } + p->szMax = iLimit; + *(sqlite3_int64*)pArg = iLimit; + rc = SQLITE_OK; + } return rc; } @@ -280,8 +305,12 @@ static int memdbFetch( void **pp ){ MemFile *p = (MemFile *)pFile; - p->nMmap++; - *pp = (void*)(p->aData + iOfst); + if( iOfst+iAmt>p->sz ){ + *pp = 0; + }else{ + p->nMmap++; + *pp = (void*)(p->aData + iOfst); + } return SQLITE_OK; } @@ -311,6 +340,7 @@ static int memdbOpen( assert( pOutFlags!=0 ); /* True because flags==SQLITE_OPEN_MAIN_DB */ *pOutFlags = flags | SQLITE_OPEN_MEMORY; p->base.pMethods = &memdb_io_methods; + p->szMax = sqlite3GlobalConfig.mxMemdbSize; return SQLITE_OK; } @@ -560,7 +590,11 @@ int sqlite3_deserialize( }else{ p->aData = pData; p->sz = szDb; + p->szAlloc = szBuf; p->szMax = szBuf; + if( p->szMaxszMax = sqlite3GlobalConfig.mxMemdbSize; + } p->mFlags = mFlags; rc = SQLITE_OK; } diff --git a/src/pager.c b/src/pager.c index e252a4b..e2a12fb 100644 --- a/src/pager.c +++ b/src/pager.c @@ -3839,7 +3839,10 @@ int sqlite3PagerMaxPageCount(Pager *pPager, int mxPage){ pPager->mxPgno = mxPage; } assert( pPager->eState!=PAGER_OPEN ); /* Called only by OP_MaxPgcnt */ - assert( pPager->mxPgno>=pPager->dbSize ); /* OP_MaxPgcnt enforces this */ + /* assert( pPager->mxPgno>=pPager->dbSize ); */ + /* OP_MaxPgcnt ensures that the parameter passed to this function is not + ** less than the total number of valid pages in the database. But this + ** may be less than Pager.dbSize, and so the assert() above is not valid */ return pPager->mxPgno; } diff --git a/src/parse.y b/src/parse.y index b150c73..1b89e69 100644 --- a/src/parse.y +++ b/src/parse.y @@ -664,6 +664,12 @@ seltablist(A) ::= stl_prefix(A) nm(Y) dbnm(D) LP exprlist(E) RP as(Z) pNew->zName = pOld->zName; pNew->zDatabase = pOld->zDatabase; pNew->pSelect = pOld->pSelect; + if( pOld->fg.isTabFunc ){ + pNew->u1.pFuncArg = pOld->u1.pFuncArg; + pOld->u1.pFuncArg = 0; + pOld->fg.isTabFunc = 0; + pNew->fg.isTabFunc = 1; + } pOld->zName = pOld->zDatabase = 0; pOld->pSelect = 0; } @@ -684,26 +690,26 @@ dbnm(A) ::= DOT nm(X). {A = X;} %type fullname {SrcList*} %destructor fullname {sqlite3SrcListDelete(pParse->db, $$);} fullname(A) ::= nm(X). { - A = sqlite3SrcListAppend(pParse->db,0,&X,0); + A = sqlite3SrcListAppend(pParse,0,&X,0); if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &X); } fullname(A) ::= nm(X) DOT nm(Y). { - A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); + A = sqlite3SrcListAppend(pParse,0,&X,&Y); if( IN_RENAME_OBJECT && A ) sqlite3RenameTokenMap(pParse, A->a[0].zName, &Y); } %type xfullname {SrcList*} %destructor xfullname {sqlite3SrcListDelete(pParse->db, $$);} xfullname(A) ::= nm(X). - {A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/} + {A = sqlite3SrcListAppend(pParse,0,&X,0); /*A-overwrites-X*/} xfullname(A) ::= nm(X) DOT nm(Y). - {A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/} + {A = sqlite3SrcListAppend(pParse,0,&X,&Y); /*A-overwrites-X*/} xfullname(A) ::= nm(X) DOT nm(Y) AS nm(Z). { - A = sqlite3SrcListAppend(pParse->db,0,&X,&Y); /*A-overwrites-X*/ + A = sqlite3SrcListAppend(pParse,0,&X,&Y); /*A-overwrites-X*/ if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z); } xfullname(A) ::= nm(X) AS nm(Z). { - A = sqlite3SrcListAppend(pParse->db,0,&X,0); /*A-overwrites-X*/ + A = sqlite3SrcListAppend(pParse,0,&X,0); /*A-overwrites-X*/ if( A ) A->a[0].zAlias = sqlite3NameFromToken(pParse->db, &Z); } @@ -820,6 +826,10 @@ limit_opt(A) ::= LIMIT expr(X) COMMA expr(Y). cmd ::= with DELETE FROM xfullname(X) indexed_opt(I) where_opt(W) orderby_opt(O) limit_opt(L). { sqlite3SrcListIndexedBy(pParse, X, &I); +#ifndef SQLITE_ENABLE_UPDATE_DELETE_LIMIT + sqlite3ExprListDelete(pParse->db, O); O = 0; + sqlite3ExprDelete(pParse->db, L); L = 0; +#endif sqlite3DeleteFrom(pParse,X,W,O,L); } %endif @@ -949,8 +959,7 @@ idlist(A) ::= nm(Y). memcpy(p->u.zToken, t.z, t.n); p->u.zToken[t.n] = 0; if( sqlite3Isquote(p->u.zToken[0]) ){ - if( p->u.zToken[0]=='"' ) p->flags |= EP_DblQuoted; - sqlite3Dequote(p->u.zToken); + sqlite3DequoteExpr(p); } #if SQLITE_MAX_EXPR_DEPTH>0 p->nHeight = 1; @@ -1161,8 +1170,10 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { ** simplify to constants 0 (false) and 1 (true), respectively, ** regardless of the value of expr1. */ - sqlite3ExprDelete(pParse->db, A); - A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); + if( IN_RENAME_OBJECT==0 ){ + sqlite3ExprDelete(pParse->db, A); + A = sqlite3ExprAlloc(pParse->db, TK_INTEGER,&sqlite3IntTokens[N],1); + } }else if( Y->nExpr==1 ){ /* Expressions of the form: ** @@ -1211,7 +1222,7 @@ expr(A) ::= expr(A) between_op(N) expr(X) AND expr(Y). [BETWEEN] { if( N ) A = sqlite3PExpr(pParse, TK_NOT, A, 0); } expr(A) ::= expr(A) in_op(N) nm(Y) dbnm(Z) paren_exprlist(E). [IN] { - SrcList *pSrc = sqlite3SrcListAppend(pParse->db, 0,&Y,&Z); + SrcList *pSrc = sqlite3SrcListAppend(pParse, 0,&Y,&Z); Select *pSelect = sqlite3SelectNew(pParse, 0,pSrc,0,0,0,0,0,0); if( E ) sqlite3SrcListFuncArgs(pParse, pSelect ? pSrc : 0, E); A = sqlite3PExpr(pParse, TK_IN, A, 0); @@ -1282,7 +1293,7 @@ paren_exprlist(A) ::= LP exprlist(X) RP. {A = X;} cmd ::= createkw(S) uniqueflag(U) INDEX ifnotexists(NE) nm(X) dbnm(D) ON nm(Y) LP sortlist(Z) RP where_opt(W). { sqlite3CreateIndex(pParse, &X, &D, - sqlite3SrcListAppend(pParse->db,0,&Y,0), Z, U, + sqlite3SrcListAppend(pParse,0,&Y,0), Z, U, &S, W, SQLITE_SO_ASC, NE, SQLITE_IDXTYPE_APPDEF); if( IN_RENAME_OBJECT && pParse->pNewIndex ){ sqlite3RenameTokenMap(pParse, pParse->pNewIndex->zName, &Y); @@ -1361,8 +1372,12 @@ cmd ::= DROP INDEX ifexists(E) fullname(X). {sqlite3DropIndex(pParse, X, E);} // %ifndef SQLITE_OMIT_VACUUM %ifndef SQLITE_OMIT_ATTACH -cmd ::= VACUUM. {sqlite3Vacuum(pParse,0);} -cmd ::= VACUUM nm(X). {sqlite3Vacuum(pParse,&X);} +%type vinto {Expr*} +%destructor vinto {sqlite3ExprDelete(pParse->db, $$);} +cmd ::= VACUUM vinto(Y). {sqlite3Vacuum(pParse,0,Y);} +cmd ::= VACUUM nm(X) vinto(Y). {sqlite3Vacuum(pParse,&X,Y);} +vinto(A) ::= INTO expr(X). {A = X;} +vinto(A) ::= . {A = 0;} %endif SQLITE_OMIT_ATTACH %endif SQLITE_OMIT_VACUUM diff --git a/src/pcache1.c b/src/pcache1.c index 2880c2c..5f502d5 100644 --- a/src/pcache1.c +++ b/src/pcache1.c @@ -92,16 +92,27 @@ typedef struct PGroup PGroup; ** structure. Unless SQLITE_PCACHE_SEPARATE_HEADER is defined, a buffer of ** PgHdr1.pCache->szPage bytes is allocated directly before this structure ** in memory. +** +** Note: Variables isBulkLocal and isAnchor were once type "u8". That works, +** but causes a 2-byte gap in the structure for most architectures (since +** pointers must be either 4 or 8-byte aligned). As this structure is located +** in memory directly after the associated page data, if the database is +** corrupt, code at the b-tree layer may overread the page buffer and +** read part of this structure before the corruption is detected. This +** can cause a valgrind error if the unitialized gap is accessed. Using u16 +** ensures there is no such gap, and therefore no bytes of unitialized memory +** in the structure. */ struct PgHdr1 { sqlite3_pcache_page page; /* Base class. Must be first. pBuf & pExtra */ unsigned int iKey; /* Key value (page number) */ - u8 isBulkLocal; /* This page from bulk local storage */ - u8 isAnchor; /* This is the PGroup.lru element */ + u16 isBulkLocal; /* This page from bulk local storage */ + u16 isAnchor; /* This is the PGroup.lru element */ PgHdr1 *pNext; /* Next in hash table chain */ PCache1 *pCache; /* Cache that currently owns this page */ PgHdr1 *pLruNext; /* Next in LRU list of unpinned pages */ PgHdr1 *pLruPrev; /* Previous in LRU list of unpinned pages */ + /* NB: pLruPrev is only valid if pLruNext!=0 */ }; /* @@ -167,6 +178,7 @@ struct PCache1 { unsigned int nMax; /* Configured "cache_size" value */ unsigned int n90pct; /* nMax*9/10 */ unsigned int iMaxKey; /* Largest key seen since xTruncate() */ + unsigned int nPurgeableDummy; /* pnPurgeable points here when not used*/ /* Hash table of all pages. The following variables may only be accessed ** when the accessor is holding the PGroup mutex. @@ -301,6 +313,7 @@ static int pcache1InitBulk(PCache1 *pCache){ pX->isBulkLocal = 1; pX->isAnchor = 0; pX->pNext = pCache->pFree; + pX->pLruPrev = 0; /* Initializing this saves a valgrind error */ pCache->pFree = pX; zBulk += pCache->szAlloc; }while( --nBulk ); @@ -476,6 +489,9 @@ static void pcache1FreePage(PgHdr1 *p){ ** exists, this function falls back to sqlite3Malloc(). */ void *sqlite3PageMalloc(int sz){ + /* During rebalance operations on a corrupt database file, it is sometimes + ** (rarely) possible to overread the temporary page buffer by a few bytes. + ** Enlarge the allocation slightly so that this does not cause problems. */ return pcache1Alloc(sz); } @@ -570,7 +586,8 @@ static PgHdr1 *pcache1PinPage(PgHdr1 *pPage){ pPage->pLruPrev->pLruNext = pPage->pLruNext; pPage->pLruNext->pLruPrev = pPage->pLruPrev; pPage->pLruNext = 0; - pPage->pLruPrev = 0; + /* pPage->pLruPrev = 0; + ** No need to clear pLruPrev as it is never accessed if pLruNext is 0 */ assert( pPage->isAnchor==0 ); assert( pPage->pCache->pGroup->lru.isAnchor==1 ); pPage->pCache->nRecyclable--; @@ -780,8 +797,7 @@ static sqlite3_pcache *pcache1Create(int szPage, int szExtra, int bPurgeable){ pGroup->mxPinned = pGroup->nMaxPage + 10 - pGroup->nMinPage; pCache->pnPurgeable = &pGroup->nPurgeable; }else{ - static unsigned int dummyCurrentPage; - pCache->pnPurgeable = &dummyCurrentPage; + pCache->pnPurgeable = &pCache->nPurgeableDummy; } pcache1LeaveMutex(pGroup); if( pCache->nHash==0 ){ @@ -908,8 +924,9 @@ static SQLITE_NOINLINE PgHdr1 *pcache1FetchStage2( pPage->iKey = iKey; pPage->pNext = pCache->apHash[h]; pPage->pCache = pCache; - pPage->pLruPrev = 0; pPage->pLruNext = 0; + /* pPage->pLruPrev = 0; + ** No need to clear pLruPrev since it is not accessed when pLruNext==0 */ *(void **)pPage->page.pExtra = 0; pCache->apHash[h] = pPage; if( iKey>pCache->iMaxKey ){ @@ -1069,7 +1086,7 @@ static void pcache1Unpin( /* It is an error to call this function if the page is already ** part of the PGroup LRU list. */ - assert( pPage->pLruPrev==0 && pPage->pLruNext==0 ); + assert( pPage->pLruNext==0 ); assert( PAGE_IS_PINNED(pPage) ); if( reuseUnlikely || pGroup->nPurgeable>pGroup->nMaxPage ){ diff --git a/src/pragma.c b/src/pragma.c index ada652c..1dcd214 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -816,7 +816,7 @@ void sqlite3Pragma( if( sqlite3GetBoolean(zRight, size!=0) ){ db->flags |= SQLITE_CacheSpill; }else{ - db->flags &= ~SQLITE_CacheSpill; + db->flags &= ~(u64)SQLITE_CacheSpill; } setAllPagerFlags(db); } @@ -1376,7 +1376,7 @@ void sqlite3Pragma( x = sqlite3FkLocateIndex(pParse, pParent, pFK, &pIdx, &aiCols); assert( x==0 ); } - addrOk = sqlite3VdbeMakeLabel(v); + addrOk = sqlite3VdbeMakeLabel(pParse); /* Generate code to read the child key values into registers ** regRow..regRow+n. If any of the child key values are NULL, this @@ -1421,19 +1421,6 @@ void sqlite3Pragma( #endif /* !defined(SQLITE_OMIT_TRIGGER) */ #endif /* !defined(SQLITE_OMIT_FOREIGN_KEY) */ -#ifndef NDEBUG - case PragTyp_PARSER_TRACE: { - if( zRight ){ - if( sqlite3GetBoolean(zRight, 0) ){ - sqlite3ParserTrace(stdout, "parser: "); - }else{ - sqlite3ParserTrace(0, 0); - } - } - } - break; -#endif - /* Reinstall the LIKE and GLOB functions. The variant of LIKE ** used will be case sensitive or not depending on the RHS. */ @@ -1596,8 +1583,8 @@ void sqlite3Pragma( if( pTab->pCheck && (db->flags & SQLITE_IgnoreChecks)==0 ){ ExprList *pCheck = sqlite3ExprListDup(db, pTab->pCheck, 0); if( db->mallocFailed==0 ){ - int addrCkFault = sqlite3VdbeMakeLabel(v); - int addrCkOk = sqlite3VdbeMakeLabel(v); + int addrCkFault = sqlite3VdbeMakeLabel(pParse); + int addrCkOk = sqlite3VdbeMakeLabel(pParse); char *zErr; int k; pParse->iSelfTab = iDataCur + 1; @@ -1620,7 +1607,7 @@ void sqlite3Pragma( /* Validate index entries for the current row */ for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ int jmp2, jmp3, jmp4, jmp5; - int ckUniq = sqlite3VdbeMakeLabel(v); + int ckUniq = sqlite3VdbeMakeLabel(pParse); if( pPk==pIdx ) continue; r1 = sqlite3GenerateIndexKey(pParse, pIdx, iDataCur, 0, 0, &jmp3, pPrior, r1); @@ -1641,7 +1628,7 @@ void sqlite3Pragma( ** current key. The entry is unique if (1) any column is NULL ** or (2) the next entry has a different key */ if( IsUniqueIndex(pIdx) ){ - int uniqOk = sqlite3VdbeMakeLabel(v); + int uniqOk = sqlite3VdbeMakeLabel(pParse); int jmp6; int kk; for(kk=0; kknKeyCol; kk++){ diff --git a/src/pragma.h b/src/pragma.h index b1d4155..c156e3a 100644 --- a/src/pragma.h +++ b/src/pragma.h @@ -49,8 +49,7 @@ #define PragTyp_HEXKEY 41 #define PragTyp_KEY 42 #define PragTyp_LOCK_STATUS 43 -#define PragTyp_PARSER_TRACE 44 -#define PragTyp_STATS 45 +#define PragTyp_STATS 44 /* Property flags associated with various pragma. */ #define PragFlg_NeedSchema 0x01 /* Force schema load before running */ @@ -461,12 +460,14 @@ static const PragmaName aPragmaName[] = { /* ColNames: */ 0, 0, /* iArg: */ 0 }, #endif -#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_PARSER_TRACE) +#if !defined(SQLITE_OMIT_FLAG_PRAGMAS) +#if defined(SQLITE_DEBUG) {/* zName: */ "parser_trace", - /* ePragTyp: */ PragTyp_PARSER_TRACE, - /* ePragFlg: */ 0, + /* ePragTyp: */ PragTyp_FLAG, + /* ePragFlg: */ PragFlg_Result0|PragFlg_NoColumns1, /* ColNames: */ 0, 0, - /* iArg: */ 0 }, + /* iArg: */ SQLITE_ParserTrace }, +#endif #endif #if defined(SQLITE_INTROSPECTION_PRAGMAS) {/* zName: */ "pragma_list", diff --git a/src/prepare.c b/src/prepare.c index 4d33f0b..3f1a79b 100644 --- a/src/prepare.c +++ b/src/prepare.c @@ -44,6 +44,19 @@ static void corruptSchema( } } +/* +** Check to see if any sibling index (another index on the same table) +** of pIndex has the same root page number, and if it does, return true. +** This would indicate a corrupt schema. +*/ +int sqlite3IndexHasDuplicateRootPage(Index *pIndex){ + Index *p; + for(p=pIndex->pTable->pIndex; p; p=p->pNext){ + if( p->tnum==pIndex->tnum && p!=pIndex ) return 1; + } + return 0; +} + /* ** This is the callback routine for the code that initializes the ** database. See sqlite3Init() below for additional information. @@ -65,6 +78,7 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ UNUSED_PARAMETER2(NotUsed, argc); assert( sqlite3_mutex_held(db->mutex) ); DbClearProperty(db, iDb, DB_Empty); + pData->nInitRow++; if( db->mallocFailed ){ corruptSchema(pData, argv[0], 0); return 1; @@ -118,15 +132,12 @@ int sqlite3InitCallback(void *pInit, int argc, char **argv, char **NotUsed){ */ Index *pIndex; pIndex = sqlite3FindIndex(db, argv[0], db->aDb[iDb].zDbSName); - if( pIndex==0 ){ - /* This can occur if there exists an index on a TEMP table which - ** has the same name as another index on a permanent index. Since - ** the permanent table is hidden by the TEMP table, we can also - ** safely ignore the index on the permanent table. - */ - /* Do Nothing */; - }else if( sqlite3GetInt32(argv[1], &pIndex->tnum)==0 ){ - corruptSchema(pData, argv[0], "invalid rootpage"); + if( pIndex==0 + || sqlite3GetInt32(argv[1],&pIndex->tnum)==0 + || pIndex->tnum<2 + || sqlite3IndexHasDuplicateRootPage(pIndex) + ){ + corruptSchema(pData, argv[0], pIndex?"invalid rootpage":"orphan index"); } } return 0; @@ -176,6 +187,7 @@ int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ initData.rc = SQLITE_OK; initData.pzErrMsg = pzErrMsg; initData.mInitFlags = mFlags; + initData.nInitRow = 0; sqlite3InitCallback(&initData, 3, (char **)azArg, 0); if( initData.rc ){ rc = initData.rc; @@ -293,7 +305,7 @@ int sqlite3InitOne(sqlite3 *db, int iDb, char **pzErrMsg, u32 mFlags){ ** indices that the user might have created. */ if( iDb==0 && meta[BTREE_FILE_FORMAT-1]>=4 ){ - db->flags &= ~SQLITE_LegacyFileFmt; + db->flags &= ~(u64)SQLITE_LegacyFileFmt; } /* Read the schema information out of the schema tables @@ -545,6 +557,7 @@ static int sqlite3Prepare( sParse.disableLookaside++; db->lookaside.bDisable++; } + sParse.disableVtab = (prepFlags & SQLITE_PREPARE_NO_VTAB)!=0; /* Check to verify that it is possible to get a read lock on all ** database schemas. The inability to get a read lock indicates that @@ -709,293 +722,6 @@ static int sqlite3LockAndPrepare( return rc; } -#ifdef SQLITE_ENABLE_NORMALIZE -/* -** Checks if the specified token is a table, column, or function name, -** based on the databases associated with the statement being prepared. -** If the function fails, zero is returned and pRc is filled with the -** error code. -*/ -static int shouldTreatAsIdentifier( - sqlite3 *db, /* Database handle. */ - const char *zToken, /* Pointer to start of token to be checked */ - int nToken, /* Length of token to be checked */ - int *pRc /* Pointer to error code upon failure */ -){ - int bFound = 0; /* Non-zero if token is an identifier name. */ - int i, j; /* Database and column loop indexes. */ - Schema *pSchema; /* Schema for current database. */ - Hash *pHash; /* Hash table of tables for current database. */ - HashElem *e; /* Hash element for hash table iteration. */ - Table *pTab; /* Database table for columns being checked. */ - - if( sqlite3IsRowidN(zToken, nToken) ){ - return 1; - } - if( nToken>0 ){ - int hash = SQLITE_FUNC_HASH(sqlite3UpperToLower[(u8)zToken[0]], nToken); - if( sqlite3FunctionSearchN(hash, zToken, nToken) ) return 1; - } - assert( db!=0 ); - sqlite3_mutex_enter(db->mutex); - sqlite3BtreeEnterAll(db); - for(i=0; inDb; i++){ - pHash = &db->aFunc; - if( sqlite3HashFindN(pHash, zToken, nToken) ){ - bFound = 1; - break; - } - pSchema = db->aDb[i].pSchema; - if( pSchema==0 ) continue; - pHash = &pSchema->tblHash; - if( sqlite3HashFindN(pHash, zToken, nToken) ){ - bFound = 1; - break; - } - for(e=sqliteHashFirst(pHash); e; e=sqliteHashNext(e)){ - pTab = sqliteHashData(e); - if( pTab==0 ) continue; - pHash = pTab->pColHash; - if( pHash==0 ){ - pTab->pColHash = pHash = sqlite3_malloc(sizeof(Hash)); - if( pHash ){ - sqlite3HashInit(pHash); - for(j=0; jnCol; j++){ - Column *pCol = &pTab->aCol[j]; - sqlite3HashInsert(pHash, pCol->zName, pCol); - } - }else{ - *pRc = SQLITE_NOMEM_BKPT; - bFound = 0; - goto done; - } - } - if( pHash && sqlite3HashFindN(pHash, zToken, nToken) ){ - bFound = 1; - goto done; - } - } - } -done: - sqlite3BtreeLeaveAll(db); - sqlite3_mutex_leave(db->mutex); - return bFound; -} - -/* -** Attempt to estimate the final output buffer size needed for the fully -** normalized version of the specified SQL string. This should take into -** account any potential expansion that could occur (e.g. via IN clauses -** being expanded, etc). This size returned is the total number of bytes -** including the NUL terminator. -*/ -static int estimateNormalizedSize( - const char *zSql, /* The original SQL string */ - int nSql, /* Length of original SQL string */ - u8 prepFlags /* The flags passed to sqlite3_prepare_v3() */ -){ - int nOut = nSql + 4; - const char *z = zSql; - while( nOut0 ){ - zOut[j++] = '"'; - continue; - }else if( k==nToken-1 ){ - zOut[j++] = '"'; - continue; - } - } - if( bKeyword ){ - zOut[j++] = sqlite3Toupper(zSql[iIn+k]); - }else{ - zOut[j++] = sqlite3Tolower(zSql[iIn+k]); - } - } - *piOut = j; -} - -/* -** Perform normalization of the SQL contained in the prepared statement and -** store the result in the zNormSql field. The schema for the associated -** databases are consulted while performing the normalization in order to -** determine if a token appears to be an identifier. All identifiers are -** left intact in the normalized SQL and all literals are replaced with a -** single '?'. -*/ -void sqlite3Normalize( - Vdbe *pVdbe, /* VM being reprepared */ - const char *zSql, /* The original SQL string */ - int nSql, /* Size of the input string in bytes */ - u8 prepFlags /* The flags passed to sqlite3_prepare_v3() */ -){ - sqlite3 *db; /* Database handle. */ - char *z; /* The output string */ - int nZ; /* Size of the output string in bytes */ - int i; /* Next character to read from zSql[] */ - int j; /* Next character to fill in on z[] */ - int tokenType = 0; /* Type of the next token */ - int prevTokenType = 0; /* Type of the previous token, except spaces */ - int n; /* Size of the next token */ - int nParen = 0; /* Nesting level of parenthesis */ - Hash inHash; /* Table of parenthesis levels to output index. */ - - db = sqlite3VdbeDb(pVdbe); - assert( db!=0 ); - assert( pVdbe->zNormSql==0 ); - if( zSql==0 ) return; - nZ = estimateNormalizedSize(zSql, nSql, prepFlags); - z = sqlite3DbMallocRawNN(db, nZ); - if( z==0 ) return; - sqlite3HashInit(&inHash); - for(i=j=0; i0 ){ - sqlite3HashInsert(&inHash, zSql+nParen, 0); - assert( jj+6=0 ); - assert( nZ-1-j=0 ); - /* Fall through */ - } - case TK_MINUS: - case TK_SEMI: - case TK_PLUS: - case TK_STAR: - case TK_SLASH: - case TK_REM: - case TK_EQ: - case TK_LE: - case TK_NE: - case TK_LSHIFT: - case TK_LT: - case TK_RSHIFT: - case TK_GT: - case TK_GE: - case TK_BITOR: - case TK_CONCAT: - case TK_COMMA: - case TK_BITAND: - case TK_BITNOT: - case TK_DOT: - case TK_IN: - case TK_IS: - case TK_NOT: - case TK_NULL: - case TK_ID: { - if( tokenType==TK_NULL ){ - if( prevTokenType==TK_IS || prevTokenType==TK_NOT ){ - /* NULL is a keyword in this case, not a literal value */ - }else{ - /* Here the NULL is a literal value */ - z[j++] = '?'; - break; - } - } - if( j>0 && sqlite3IsIdChar(z[j-1]) && sqlite3IsIdChar(zSql[i]) ){ - z[j++] = ' '; - } - if( tokenType==TK_ID ){ - int i2 = i, n2 = n, rc = SQLITE_OK; - if( nParen>0 ){ - assert( nParen0 && z[j-1]==' ' ){ j--; } - if( j>0 && z[j-1]!=';' ){ z[j++] = ';'; } - z[j] = 0; - assert( jzNormSql = z; - sqlite3HashClear(&inHash); -} -#endif /* SQLITE_ENABLE_NORMALIZE */ /* ** Rerun the compilation of a statement after a schema change. diff --git a/src/printf.c b/src/printf.c index 7bce83f..f11fb66 100644 --- a/src/printf.c +++ b/src/printf.c @@ -155,6 +155,27 @@ static char *getTextArg(PrintfArguments *p){ return (char*)sqlite3_value_text(p->apArg[p->nUsed++]); } +/* +** Allocate memory for a temporary buffer needed for printf rendering. +** +** If the requested size of the temp buffer is larger than the size +** of the output buffer in pAccum, then cause an SQLITE_TOOBIG error. +** Do the size check before the memory allocation to prevent rogue +** SQL from requesting large allocations using the precision or width +** field of the printf() function. +*/ +static char *printfTempBuf(sqlite3_str *pAccum, sqlite3_int64 n){ + char *z; + if( n>pAccum->nAlloc && n>pAccum->mxAlloc ){ + setStrAccumError(pAccum, SQLITE_TOOBIG); + return 0; + } + z = sqlite3DbMallocRaw(pAccum->db, n); + if( z==0 ){ + setStrAccumError(pAccum, SQLITE_NOMEM); + } + return z; +} /* ** On machines with a small stack size, you can redefine the @@ -237,6 +258,9 @@ void sqlite3_str_vappendf( flag_leftjustify = flag_prefix = cThousand = flag_alternateform = flag_altform2 = flag_zeropad = 0; done = 0; + width = 0; + flag_long = 0; + precision = -1; do{ switch( c ){ case '-': flag_leftjustify = 1; break; @@ -247,80 +271,93 @@ void sqlite3_str_vappendf( case '0': flag_zeropad = 1; break; case ',': cThousand = ','; break; default: done = 1; break; + case 'l': { + flag_long = 1; + c = *++fmt; + if( c=='l' ){ + c = *++fmt; + flag_long = 2; + } + done = 1; + break; + } + case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': { + unsigned wx = c - '0'; + while( (c = *++fmt)>='0' && c<='9' ){ + wx = wx*10 + c - '0'; + } + testcase( wx>0x7fffffff ); + width = wx & 0x7fffffff; +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( c!='.' && c!='l' ){ + done = 1; + }else{ + fmt--; + } + break; + } + case '*': { + if( bArgList ){ + width = (int)getIntArg(pArgList); + }else{ + width = va_arg(ap,int); + } + if( width<0 ){ + flag_leftjustify = 1; + width = width >= -2147483647 ? -width : 0; + } +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ + width = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( (c = fmt[1])!='.' && c!='l' ){ + c = *++fmt; + done = 1; + } + break; + } + case '.': { + c = *++fmt; + if( c=='*' ){ + if( bArgList ){ + precision = (int)getIntArg(pArgList); + }else{ + precision = va_arg(ap,int); + } + if( precision<0 ){ + precision = precision >= -2147483647 ? -precision : -1; + } + c = *++fmt; + }else{ + unsigned px = 0; + while( c>='0' && c<='9' ){ + px = px*10 + c - '0'; + c = *++fmt; + } + testcase( px>0x7fffffff ); + precision = px & 0x7fffffff; + } +#ifdef SQLITE_PRINTF_PRECISION_LIMIT + if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ + precision = SQLITE_PRINTF_PRECISION_LIMIT; + } +#endif + if( c=='l' ){ + --fmt; + }else{ + done = 1; + } + break; + } } }while( !done && (c=(*++fmt))!=0 ); - /* Get the field width */ - if( c=='*' ){ - if( bArgList ){ - width = (int)getIntArg(pArgList); - }else{ - width = va_arg(ap,int); - } - if( width<0 ){ - flag_leftjustify = 1; - width = width >= -2147483647 ? -width : 0; - } - c = *++fmt; - }else{ - unsigned wx = 0; - while( c>='0' && c<='9' ){ - wx = wx*10 + c - '0'; - c = *++fmt; - } - testcase( wx>0x7fffffff ); - width = wx & 0x7fffffff; - } - assert( width>=0 ); -#ifdef SQLITE_PRINTF_PRECISION_LIMIT - if( width>SQLITE_PRINTF_PRECISION_LIMIT ){ - width = SQLITE_PRINTF_PRECISION_LIMIT; - } -#endif - /* Get the precision */ - if( c=='.' ){ - c = *++fmt; - if( c=='*' ){ - if( bArgList ){ - precision = (int)getIntArg(pArgList); - }else{ - precision = va_arg(ap,int); - } - c = *++fmt; - if( precision<0 ){ - precision = precision >= -2147483647 ? -precision : -1; - } - }else{ - unsigned px = 0; - while( c>='0' && c<='9' ){ - px = px*10 + c - '0'; - c = *++fmt; - } - testcase( px>0x7fffffff ); - precision = px & 0x7fffffff; - } - }else{ - precision = -1; - } - assert( precision>=(-1) ); -#ifdef SQLITE_PRINTF_PRECISION_LIMIT - if( precision>SQLITE_PRINTF_PRECISION_LIMIT ){ - precision = SQLITE_PRINTF_PRECISION_LIMIT; - } -#endif - - - /* Get the conversion type modifier */ - if( c=='l' ){ - flag_long = 1; - c = *++fmt; - if( c=='l' ){ - flag_long = 2; - c = *++fmt; - } - }else{ - flag_long = 0; - } /* Fetch the info entry for the field */ infop = &fmtinfo[0]; xtype = etINVALID; @@ -405,12 +442,11 @@ void sqlite3_str_vappendf( nOut = etBUFSIZE; zOut = buf; }else{ - u64 n = (u64)precision + 10 + precision/3; - zOut = zExtra = sqlite3Malloc( n ); - if( zOut==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; - } + u64 n; + n = (u64)precision + 10; + if( cThousand ) n += precision/3; + zOut = zExtra = printfTempBuf(pAccum, n); + if( zOut==0 ) return; nOut = (int)n; } bufpt = &zOut[nOut-1]; @@ -529,12 +565,12 @@ void sqlite3_str_vappendf( }else{ e2 = exp; } - if( MAX(e2,0)+(i64)precision+(i64)width > etBUFSIZE - 15 ){ - bufpt = zExtra - = sqlite3Malloc( MAX(e2,0)+(i64)precision+(i64)width+15 ); - if( bufpt==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; + { + i64 szBufNeeded; /* Size of a temporary buffer needed */ + szBufNeeded = MAX(e2,0)+(i64)precision+(i64)width+15; + if( szBufNeeded > etBUFSIZE ){ + bufpt = zExtra = printfTempBuf(pAccum, szBufNeeded); + if( bufpt==0 ) return; } } zOut = bufpt; @@ -758,11 +794,8 @@ void sqlite3_str_vappendf( needQuote = !isnull && xtype==etSQLESCAPE2; n += i + 3; if( n>etBUFSIZE ){ - bufpt = zExtra = sqlite3Malloc( n ); - if( bufpt==0 ){ - setStrAccumError(pAccum, SQLITE_NOMEM); - return; - } + bufpt = zExtra = printfTempBuf(pAccum, n); + if( bufpt==0 ) return; }else{ bufpt = buf; } diff --git a/src/resolve.c b/src/resolve.c index 0c7dfc0..86fd543 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -80,7 +80,6 @@ static void resolveAlias( if( pExpr->op==TK_COLLATE ){ pDup = sqlite3ExprAddCollateString(pParse, pDup, pExpr->u.zToken); } - ExprSetProperty(pDup, EP_Alias); /* Before calling sqlite3ExprDelete(), set the EP_Static flag. This ** prevents ExprDelete() from deleting the Expr structure itself, @@ -474,6 +473,25 @@ static int lookupName( if( cnt==0 && zTab==0 ){ assert( pExpr->op==TK_ID ); if( ExprHasProperty(pExpr,EP_DblQuoted) ){ + /* If a double-quoted identifier does not match any known column name, + ** then treat it as a string. + ** + ** This hack was added in the early days of SQLite in a misguided attempt + ** to be compatible with MySQL 3.x, which used double-quotes for strings. + ** I now sorely regret putting in this hack. The effect of this hack is + ** that misspelled identifier names are silently converted into strings + ** rather than causing an error, to the frustration of countless + ** programmers. To all those frustrated programmers, my apologies. + ** + ** Someday, I hope to get rid of this hack. Unfortunately there is + ** a huge amount of legacy SQL that uses it. So for now, we just + ** issue a warning. + */ + sqlite3_log(SQLITE_WARNING, + "double-quoted string literal: \"%w\"", zCol); +#ifdef SQLITE_ENABLE_NORMALIZE + sqlite3VdbeAddDblquoteStr(db, pParse->pVdbe, zCol); +#endif pExpr->op = TK_STRING; pExpr->y.pTab = 0; return WRC_Prune; @@ -840,10 +858,10 @@ static int resolveExprStep(Walker *pWalker, Expr *pExpr){ #ifndef SQLITE_OMIT_WINDOWFUNC if( pExpr->y.pWin ){ Select *pSel = pNC->pWinSelect; + sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.pWin, pDef); sqlite3WalkExprList(pWalker, pExpr->y.pWin->pPartition); sqlite3WalkExprList(pWalker, pExpr->y.pWin->pOrderBy); sqlite3WalkExpr(pWalker, pExpr->y.pWin->pFilter); - sqlite3WindowUpdate(pParse, pSel->pWinDefn, pExpr->y.pWin, pDef); if( 0==pSel->pWin || 0==sqlite3WindowCompare(pParse, pSel->pWin, pExpr->y.pWin) ){ @@ -1120,32 +1138,53 @@ static int resolveCompoundOrderBy( }else{ iCol = resolveAsName(pParse, pEList, pE); if( iCol==0 ){ - pDup = sqlite3ExprDup(db, pE, 0); + /* Now test if expression pE matches one of the values returned + ** by pSelect. In the usual case this is done by duplicating the + ** expression, resolving any symbols in it, and then comparing + ** it against each expression returned by the SELECT statement. + ** Once the comparisons are finished, the duplicate expression + ** is deleted. + ** + ** Or, if this is running as part of an ALTER TABLE operation, + ** resolve the symbols in the actual expression, not a duplicate. + ** And, if one of the comparisons is successful, leave the expression + ** as is instead of transforming it to an integer as in the usual + ** case. This allows the code in alter.c to modify column + ** refererences within the ORDER BY expression as required. */ + if( IN_RENAME_OBJECT ){ + pDup = pE; + }else{ + pDup = sqlite3ExprDup(db, pE, 0); + } if( !db->mallocFailed ){ assert(pDup); iCol = resolveOrderByTermToExprList(pParse, pSelect, pDup); } - sqlite3ExprDelete(db, pDup); + if( !IN_RENAME_OBJECT ){ + sqlite3ExprDelete(db, pDup); + } } } if( iCol>0 ){ /* Convert the ORDER BY term into an integer column number iCol, ** taking care to preserve the COLLATE clause if it exists */ - Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); - if( pNew==0 ) return 1; - pNew->flags |= EP_IntValue; - pNew->u.iValue = iCol; - if( pItem->pExpr==pE ){ - pItem->pExpr = pNew; - }else{ - Expr *pParent = pItem->pExpr; - assert( pParent->op==TK_COLLATE ); - while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; - assert( pParent->pLeft==pE ); - pParent->pLeft = pNew; + if( !IN_RENAME_OBJECT ){ + Expr *pNew = sqlite3Expr(db, TK_INTEGER, 0); + if( pNew==0 ) return 1; + pNew->flags |= EP_IntValue; + pNew->u.iValue = iCol; + if( pItem->pExpr==pE ){ + pItem->pExpr = pNew; + }else{ + Expr *pParent = pItem->pExpr; + assert( pParent->op==TK_COLLATE ); + while( pParent->pLeft->op==TK_COLLATE ) pParent = pParent->pLeft; + assert( pParent->pLeft==pE ); + pParent->pLeft = pNew; + } + sqlite3ExprDelete(db, pE); + pItem->u.x.iOrderByCol = (u16)iCol; } - sqlite3ExprDelete(db, pE); - pItem->u.x.iOrderByCol = (u16)iCol; pItem->done = 1; }else{ moreToDo = 1; @@ -1494,6 +1533,17 @@ static int resolveSelectStep(Walker *pWalker, Select *p){ } } + if( IN_RENAME_OBJECT ){ + Window *pWin; + for(pWin=p->pWinDefn; pWin; pWin=pWin->pNextWin){ + if( sqlite3ResolveExprListNames(&sNC, pWin->pOrderBy) + || sqlite3ResolveExprListNames(&sNC, pWin->pPartition) + ){ + return WRC_Abort; + } + } + } + /* If this is part of a compound SELECT, check that it has the right ** number of expressions in the select list. */ if( p->pNext && p->pEList->nExpr!=p->pNext->pEList->nExpr ){ @@ -1644,36 +1694,45 @@ void sqlite3ResolveSelectNames( } /* -** Resolve names in expressions that can only reference a single table: +** Resolve names in expressions that can only reference a single table +** or which cannot reference any tables at all. Examples: ** -** * CHECK constraints -** * WHERE clauses on partial indices +** (1) CHECK constraints +** (2) WHERE clauses on partial indices +** (3) Expressions in indexes on expressions +** (4) Expression arguments to VACUUM INTO. ** -** The Expr.iTable value for Expr.op==TK_COLUMN nodes of the expression -** is set to -1 and the Expr.iColumn value is set to the column number. +** In all cases except (4), the Expr.iTable value for Expr.op==TK_COLUMN +** nodes of the expression is set to -1 and the Expr.iColumn value is +** set to the column number. In case (4), TK_COLUMN nodes cause an error. ** ** Any errors cause an error message to be set in pParse. */ -void sqlite3ResolveSelfReference( +int sqlite3ResolveSelfReference( Parse *pParse, /* Parsing context */ - Table *pTab, /* The table being referenced */ - int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr */ + Table *pTab, /* The table being referenced, or NULL */ + int type, /* NC_IsCheck or NC_PartIdx or NC_IdxExpr, or 0 */ Expr *pExpr, /* Expression to resolve. May be NULL. */ ExprList *pList /* Expression list to resolve. May be NULL. */ ){ SrcList sSrc; /* Fake SrcList for pParse->pNewTable */ NameContext sNC; /* Name context for pParse->pNewTable */ + int rc; - assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr ); + assert( type==0 || pTab!=0 ); + assert( type==NC_IsCheck || type==NC_PartIdx || type==NC_IdxExpr || pTab==0 ); memset(&sNC, 0, sizeof(sNC)); memset(&sSrc, 0, sizeof(sSrc)); - sSrc.nSrc = 1; - sSrc.a[0].zName = pTab->zName; - sSrc.a[0].pTab = pTab; - sSrc.a[0].iCursor = -1; + if( pTab ){ + sSrc.nSrc = 1; + sSrc.a[0].zName = pTab->zName; + sSrc.a[0].pTab = pTab; + sSrc.a[0].iCursor = -1; + } sNC.pParse = pParse; sNC.pSrcList = &sSrc; sNC.ncFlags = type; - if( sqlite3ResolveExprNames(&sNC, pExpr) ) return; - if( pList ) sqlite3ResolveExprListNames(&sNC, pList); + if( (rc = sqlite3ResolveExprNames(&sNC, pExpr))!=SQLITE_OK ) return rc; + if( pList ) rc = sqlite3ResolveExprListNames(&sNC, pList); + return rc; } diff --git a/src/select.c b/src/select.c index c60ff27..f30cea5 100644 --- a/src/select.c +++ b/src/select.c @@ -631,7 +631,7 @@ static void pushOntoSorter( } assert( pSelect->iOffset==0 || pSelect->iLimit!=0 ); iLimit = pSelect->iOffset ? pSelect->iOffset+1 : pSelect->iLimit; - pSort->labelDone = sqlite3VdbeMakeLabel(v); + pSort->labelDone = sqlite3VdbeMakeLabel(pParse); sqlite3ExprCodeExprList(pParse, pSort->pOrderBy, regBase, regOrigData, SQLITE_ECEL_DUP | (regOrigData? SQLITE_ECEL_REF : 0)); if( bSeq ){ @@ -670,7 +670,7 @@ static void pushOntoSorter( pKI->nAllField-pKI->nKeyField-1); addrJmp = sqlite3VdbeCurrentAddr(v); sqlite3VdbeAddOp3(v, OP_Jump, addrJmp+1, 0, addrJmp+1); VdbeCoverage(v); - pSort->labelBkOut = sqlite3VdbeMakeLabel(v); + pSort->labelBkOut = sqlite3VdbeMakeLabel(pParse); pSort->regReturn = ++pParse->nMem; sqlite3VdbeAddOp2(v, OP_Gosub, pSort->regReturn, pSort->labelBkOut); sqlite3VdbeAddOp1(v, OP_ResetSorter, pSort->iECursor); @@ -1417,7 +1417,7 @@ static void generateSortTail( ){ Vdbe *v = pParse->pVdbe; /* The prepared statement */ int addrBreak = pSort->labelDone; /* Jump here to exit loop */ - int addrContinue = sqlite3VdbeMakeLabel(v); /* Jump here for next cycle */ + int addrContinue = sqlite3VdbeMakeLabel(pParse);/* Jump here for next cycle */ int addr; /* Top of output loop. Jump for Next. */ int addrOnce = 0; int iTab; @@ -1457,7 +1457,12 @@ static void generateSortTail( regRow = pDest->iSdst; }else{ regRowid = sqlite3GetTempReg(pParse); - regRow = sqlite3GetTempRange(pParse, nColumn); + if( eDest==SRT_EphemTab || eDest==SRT_Table ){ + regRow = sqlite3GetTempReg(pParse); + nColumn = 0; + }else{ + regRow = sqlite3GetTempRange(pParse, nColumn); + } } nKey = pOrderBy->nExpr - pSort->nOBSat; if( pSort->sortFlags & SORTFLAG_UseSorter ){ @@ -1537,6 +1542,7 @@ static void generateSortTail( switch( eDest ){ case SRT_Table: case SRT_EphemTab: { + sqlite3VdbeAddOp3(v, OP_Column, iSortTab, nKey+bSeq, regRow); sqlite3VdbeAddOp2(v, OP_NewRowid, iParm, regRowid); sqlite3VdbeAddOp3(v, OP_Insert, iParm, regRow, regRowid); sqlite3VdbeChangeP5(v, OPFLAG_APPEND); @@ -2077,15 +2083,15 @@ void sqlite3SelectAddColumnTypeAndCollation( Table *sqlite3ResultSetOfSelect(Parse *pParse, Select *pSelect){ Table *pTab; sqlite3 *db = pParse->db; - int savedFlags; + u64 savedFlags; savedFlags = db->flags; - db->flags &= ~SQLITE_FullColNames; + db->flags &= ~(u64)SQLITE_FullColNames; db->flags |= SQLITE_ShortColNames; sqlite3SelectPrep(pParse, pSelect, 0); + db->flags = savedFlags; if( pParse->nErr ) return 0; while( pSelect->pPrior ) pSelect = pSelect->pPrior; - db->flags = savedFlags; pTab = sqlite3DbMallocZero(db, sizeof(Table) ); if( pTab==0 ){ return 0; @@ -2329,7 +2335,7 @@ static void generateWithRecursiveQuery( if( sqlite3AuthCheck(pParse, SQLITE_RECURSIVE, 0, 0, 0) ) return; /* Process the LIMIT and OFFSET clauses, if they exist */ - addrBreak = sqlite3VdbeMakeLabel(v); + addrBreak = sqlite3VdbeMakeLabel(pParse); p->nSelectRow = 320; /* 4 billion rows */ computeLimitRegisters(pParse, p, addrBreak); pLimit = p->pLimit; @@ -2399,7 +2405,7 @@ static void generateWithRecursiveQuery( sqlite3VdbeAddOp1(v, OP_Delete, iQueue); /* Output the single row in Current */ - addrCont = sqlite3VdbeMakeLabel(v); + addrCont = sqlite3VdbeMakeLabel(pParse); codeOffset(v, regOffset, addrCont); selectInnerLoop(pParse, p, iCurrent, 0, 0, pDest, addrCont, addrBreak); @@ -2707,8 +2713,8 @@ static int multiSelect( if( dest.eDest!=priorOp ){ int iCont, iBreak, iStart; assert( p->pEList ); - iBreak = sqlite3VdbeMakeLabel(v); - iCont = sqlite3VdbeMakeLabel(v); + iBreak = sqlite3VdbeMakeLabel(pParse); + iCont = sqlite3VdbeMakeLabel(pParse); computeLimitRegisters(pParse, p, iBreak); sqlite3VdbeAddOp2(v, OP_Rewind, unionTab, iBreak); VdbeCoverage(v); iStart = sqlite3VdbeCurrentAddr(v); @@ -2776,8 +2782,8 @@ static int multiSelect( ** tables. */ assert( p->pEList ); - iBreak = sqlite3VdbeMakeLabel(v); - iCont = sqlite3VdbeMakeLabel(v); + iBreak = sqlite3VdbeMakeLabel(pParse); + iCont = sqlite3VdbeMakeLabel(pParse); computeLimitRegisters(pParse, p, iBreak); sqlite3VdbeAddOp2(v, OP_Rewind, tab1, iBreak); VdbeCoverage(v); r1 = sqlite3GetTempReg(pParse); @@ -2907,7 +2913,7 @@ static int generateOutputSubroutine( int addr; addr = sqlite3VdbeCurrentAddr(v); - iContinue = sqlite3VdbeMakeLabel(v); + iContinue = sqlite3VdbeMakeLabel(pParse); /* Suppress duplicates for UNION, EXCEPT, and INTERSECT */ @@ -3144,8 +3150,8 @@ static int multiSelectOrderBy( db = pParse->db; v = pParse->pVdbe; assert( v!=0 ); /* Already thrown the error if VDBE alloc failed */ - labelEnd = sqlite3VdbeMakeLabel(v); - labelCmpr = sqlite3VdbeMakeLabel(v); + labelEnd = sqlite3VdbeMakeLabel(pParse); + labelCmpr = sqlite3VdbeMakeLabel(pParse); /* Patch up the ORDER BY clause @@ -3461,6 +3467,7 @@ static Expr *substExpr( ifNullRow.iTable = pSubst->iNewTable; pCopy = &ifNullRow; } + testcase( ExprHasProperty(pCopy, EP_Subquery) ); pNew = sqlite3ExprDup(db, pCopy, 0); if( pNew && pSubst->isLeftJoin ){ ExprSetProperty(pNew, EP_CanBeNull); @@ -3953,11 +3960,9 @@ static int flattenSubquery( jointype = pSubitem->fg.jointype; }else{ assert( pParent!=p ); /* 2nd and subsequent times through the loop */ - pSrc = pParent->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); - if( pSrc==0 ){ - assert( db->mallocFailed ); - break; - } + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); + if( pSrc==0 ) break; + pParent->pSrc = pSrc; } /* The subquery uses a single slot of the FROM clause of the outer @@ -3976,10 +3981,9 @@ static int flattenSubquery( ** for the two elements in the FROM clause of the subquery. */ if( nSubSrc>1 ){ - pParent->pSrc = pSrc = sqlite3SrcListEnlarge(db, pSrc, nSubSrc-1,iFrom+1); - if( db->mallocFailed ){ - break; - } + pSrc = sqlite3SrcListEnlarge(pParse, pSrc, nSubSrc-1,iFrom+1); + if( pSrc==0 ) break; + pParent->pSrc = pSrc; } /* Transfer the FROM clause terms from the subquery into the @@ -4025,7 +4029,8 @@ static int flattenSubquery( pParent->pOrderBy = pOrderBy; pSub->pOrderBy = 0; } - pWhere = sqlite3ExprDup(db, pSub->pWhere, 0); + pWhere = pSub->pWhere; + pSub->pWhere = 0; if( isLeftJoin>0 ){ setJoinExpr(pWhere, iNewParent); } @@ -5328,7 +5333,7 @@ static void updateAccumulator(Parse *pParse, int regAcc, AggInfo *pAggInfo){ regAgg = 0; } if( pF->iDistinct>=0 ){ - addrNext = sqlite3VdbeMakeLabel(v); + addrNext = sqlite3VdbeMakeLabel(pParse); testcase( nArg==0 ); /* Error condition */ testcase( nArg>1 ); /* Also an error */ codeDistinct(pParse, pF->iDistinct, addrNext, 1, regAgg); @@ -5464,14 +5469,19 @@ static struct SrcList_item *isSelfJoinView( ){ struct SrcList_item *pItem; for(pItem = pTabList->a; pItempSelect==0 ) continue; if( pItem->fg.viaCoroutine ) continue; if( pItem->zName==0 ) continue; if( sqlite3_stricmp(pItem->zDatabase, pThis->zDatabase)!=0 ) continue; if( sqlite3_stricmp(pItem->zName, pThis->zName)!=0 ) continue; - if( sqlite3ExprCompare(0, - pThis->pSelect->pWhere, pItem->pSelect->pWhere, -1) - ){ + pS1 = pItem->pSelect; + if( pThis->pSelect->selId!=pS1->selId ){ + /* The query flattener left two different CTE tables with identical + ** names in the same FROM clause. */ + continue; + } + if( sqlite3ExprCompare(0, pThis->pSelect->pWhere, pS1->pWhere, -1) ){ /* The view was modified by some other optimization such as ** pushDownWhereTerms() */ continue; @@ -5733,6 +5743,7 @@ int sqlite3Select( } if( flattenSubquery(pParse, p, i, isAgg) ){ + if( pParse->nErr ) goto select_end; /* This subquery can be absorbed into its parent. */ i = -1; } @@ -5828,22 +5839,12 @@ int sqlite3Select( pSub = pItem->pSelect; if( pSub==0 ) continue; - /* Sometimes the code for a subquery will be generated more than - ** once, if the subquery is part of the WHERE clause in a LEFT JOIN, - ** for example. In that case, do not regenerate the code to manifest - ** a view or the co-routine to implement a view. The first instance - ** is sufficient, though the subroutine to manifest the view does need - ** to be invoked again. */ - if( pItem->addrFillSub ){ - if( pItem->fg.viaCoroutine==0 ){ - /* The subroutine that manifests the view might be a one-time routine, - ** or it might need to be rerun on each iteration because it - ** encodes a correlated subquery. */ - testcase( sqlite3VdbeGetOp(v, pItem->addrFillSub)->opcode==OP_Once ); - sqlite3VdbeAddOp2(v, OP_Gosub, pItem->regReturn, pItem->addrFillSub); - } - continue; - } + /* The code for a subquery should only be generated once, though it is + ** technically harmless for it to be generated multiple times. The + ** following assert() will detect if something changes to cause + ** the same subquery to be coded multiple times, as a signal to the + ** developers to try to optimize the situation. */ + assert( pItem->addrFillSub==0 ); /* Increment Parse.nHeight by the height of the largest expression ** tree referred to by this, the parent select. The child select @@ -6031,7 +6032,7 @@ int sqlite3Select( /* Set the limiter. */ - iEnd = sqlite3VdbeMakeLabel(v); + iEnd = sqlite3VdbeMakeLabel(pParse); if( (p->selFlags & SF_FixedLimit)==0 ){ p->nSelectRow = 320; /* 4 billion rows */ } @@ -6098,9 +6099,9 @@ int sqlite3Select( assert( p->pEList==pEList ); #ifndef SQLITE_OMIT_WINDOWFUNC if( pWin ){ - int addrGosub = sqlite3VdbeMakeLabel(v); - int iCont = sqlite3VdbeMakeLabel(v); - int iBreak = sqlite3VdbeMakeLabel(v); + int addrGosub = sqlite3VdbeMakeLabel(pParse); + int iCont = sqlite3VdbeMakeLabel(pParse); + int iBreak = sqlite3VdbeMakeLabel(pParse); int regGosub = ++pParse->nMem; sqlite3WindowCodeStep(pParse, p, pWInfo, regGosub, addrGosub); @@ -6175,7 +6176,7 @@ int sqlite3Select( } /* Create a label to jump to when we want to abort the query */ - addrEnd = sqlite3VdbeMakeLabel(v); + addrEnd = sqlite3VdbeMakeLabel(pParse); /* Convert TK_COLUMN nodes into TK_AGG_COLUMN and make entries in ** sAggInfo for all TK_AGG_FUNCTION nodes in expressions of the @@ -6264,9 +6265,9 @@ int sqlite3Select( iUseFlag = ++pParse->nMem; iAbortFlag = ++pParse->nMem; regOutputRow = ++pParse->nMem; - addrOutputRow = sqlite3VdbeMakeLabel(v); + addrOutputRow = sqlite3VdbeMakeLabel(pParse); regReset = ++pParse->nMem; - addrReset = sqlite3VdbeMakeLabel(v); + addrReset = sqlite3VdbeMakeLabel(pParse); iAMem = pParse->nMem + 1; pParse->nMem += pGroupBy->nExpr; iBMem = pParse->nMem + 1; diff --git a/src/shell.c.in b/src/shell.c.in index ad5a149..c7d94db 100644 --- a/src/shell.c.in +++ b/src/shell.c.in @@ -138,6 +138,9 @@ typedef unsigned char u8; # ifndef unlink # define unlink _unlink # endif +# ifndef strdup +# define strdup _strdup +# endif # undef popen # define popen _popen # undef pclose @@ -937,6 +940,7 @@ INCLUDE ../ext/misc/shathree.c INCLUDE ../ext/misc/fileio.c INCLUDE ../ext/misc/completion.c INCLUDE ../ext/misc/appendvfs.c +INCLUDE ../ext/misc/memtrace.c #ifdef SQLITE_HAVE_ZLIB INCLUDE ../ext/misc/zipfile.c INCLUDE ../ext/misc/sqlar.c @@ -1002,14 +1006,18 @@ struct ShellState { u8 autoExplain; /* Automatically turn on .explain mode */ u8 autoEQP; /* Run EXPLAIN QUERY PLAN prior to seach SQL stmt */ u8 autoEQPtest; /* autoEQP is in test mode */ + u8 autoEQPtrace; /* autoEQP is in trace mode */ u8 statsOn; /* True to display memory stats before each finalize */ u8 scanstatsOn; /* True to display scan stats before each finalize */ u8 openMode; /* SHELL_OPEN_NORMAL, _APPENDVFS, or _ZIPFILE */ u8 doXdgOpen; /* Invoke start/open/xdg-open in output_reset() */ u8 nEqpLevel; /* Depth of the EQP output graph */ + u8 eTraceType; /* SHELL_TRACE_* value for type of trace */ unsigned mEqpLines; /* Mask of veritical lines in the EQP output graph */ int outCount; /* Revert to stdout when reaching zero */ int cnt; /* Number of records displayed so far */ + int lineno; /* Line number of last line read from in */ + FILE *in; /* Read commands from this stream */ FILE *out; /* Write results here */ FILE *traceOut; /* Output for sqlite3_trace() */ int nErr; /* Number of errors seen */ @@ -1020,7 +1028,11 @@ struct ShellState { int writableSchema; /* True if PRAGMA writable_schema=ON */ int showHeader; /* True to show column names in List or Column mode */ int nCheck; /* Number of ".check" commands run */ + unsigned nProgress; /* Number of progress callbacks encountered */ + unsigned mxProgress; /* Maximum progress callbacks before failing */ + unsigned flgProgress; /* Flags for the progress callback */ unsigned shellFlgs; /* Various flags */ + sqlite3_int64 szMax; /* --maxsize argument to .open */ char *zDestTable; /* Name of destination table when MODE_Insert */ char *zTempFile; /* Temporary file that might need deleting */ char zTestcase[30]; /* Name of current test case */ @@ -1065,6 +1077,20 @@ struct ShellState { #define SHELL_OPEN_ZIPFILE 3 /* Use the zipfile virtual table */ #define SHELL_OPEN_READONLY 4 /* Open a normal database read-only */ #define SHELL_OPEN_DESERIALIZE 5 /* Open using sqlite3_deserialize() */ +#define SHELL_OPEN_HEXDB 6 /* Use "dbtotxt" output as data source */ + +/* Allowed values for ShellState.eTraceType +*/ +#define SHELL_TRACE_PLAIN 0 /* Show input SQL text */ +#define SHELL_TRACE_EXPANDED 1 /* Show expanded SQL text */ +#define SHELL_TRACE_NORMALIZED 2 /* Show normalized SQL text */ + +/* Bits in the ShellState.flgProgress variable */ +#define SHELL_PROGRESS_QUIET 0x01 /* Omit announcing every progress callback */ +#define SHELL_PROGRESS_RESET 0x02 /* Reset the count when the progres + ** callback limit is reached, and for each + ** top-level SQL statement */ +#define SHELL_PROGRESS_ONCE 0x04 /* Cancel the --limit after firing once */ /* ** These are the allowed shellFlgs values @@ -1766,6 +1792,26 @@ static void eqp_render(ShellState *p){ } } +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK +/* +** Progress handler callback. +*/ +static int progress_handler(void *pClientData) { + ShellState *p = (ShellState*)pClientData; + p->nProgress++; + if( p->nProgress>=p->mxProgress && p->mxProgress>0 ){ + raw_printf(p->out, "Progress limit reached (%u)\n", p->nProgress); + if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; + if( p->flgProgress & SHELL_PROGRESS_ONCE ) p->mxProgress = 0; + return 1; + } + if( (p->flgProgress & SHELL_PROGRESS_QUIET)==0 ){ + raw_printf(p->out, "Progress %u\n", p->nProgress); + } + return 0; +} +#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ + /* ** This is the callback routine that the shell ** invokes for each row of a query result. @@ -3370,6 +3416,7 @@ static const char *(azHelp[]) = { #endif ".backup ?DB? FILE Backup DB (default \"main\") to FILE", " --append Use the appendvfs", + " --async Write to FILE without a journal and without fsync()", ".bail on|off Stop after hitting an error. Default OFF", ".binary on|off Turn binary output on or off. Default OFF", ".cd DIRECTORY Change the working directory to DIRECTORY", @@ -3385,7 +3432,13 @@ static const char *(azHelp[]) = { " --newlines Allow unescaped newline characters in output", " TABLE is LIKE pattern for the tables to dump", ".echo on|off Turn command echo on or off", - ".eqp on|off|full Enable or disable automatic EXPLAIN QUERY PLAN", + ".eqp on|off|full|... Enable or disable automatic EXPLAIN QUERY PLAN", + " Other Modes:", +#ifdef SQLITE_DEBUG + " test Show raw EXPLAIN QUERY PLAN output", + " trace Like \"full\" but also enable \"PRAGMA vdbe_trace\"", +#endif + " trigger Like \"full\" but also show trigger bytecode", ".excel Display the output of next command in a spreadsheet", ".exit ?CODE? Exit this program with return-code CODE", ".expert EXPERIMENTAL. Suggest indexes for specified queries", @@ -3436,6 +3489,8 @@ static const char *(azHelp[]) = { " --append Use appendvfs to append database to the end of FILE", #ifdef SQLITE_ENABLE_DESERIALIZE " --deserialize Load into memory useing sqlite3_deserialize()", + " --hexdb Load the output of \"dbtotxt\" as an in-memory database", + " --maxsize N Maximum size for --hexdb or --deserialized database", #endif " --new Initialize FILE to an empty database", " --readonly Open FILE readonly", @@ -3443,6 +3498,13 @@ static const char *(azHelp[]) = { ".output ?FILE? Send output to FILE or stdout if FILE is omitted", " If FILE begins with '|' then open it as a pipe.", ".print STRING... Print literal STRING", +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + ".progress N Invoke progress handler after every N opcodes", + " --limit N Interrupt after N progress callbacks", + " --once Do no more than one progress interrupt", + " --quiet|-q No output except at interrupts", + " --reset Reset the count for each input and interrupt", +#endif ".prompt MAIN CONTINUE Replace the standard prompts", ".quit Exit this program", ".read FILE Read input from FILE", @@ -3492,7 +3554,22 @@ static const char *(azHelp[]) = { ".testcase NAME Begin redirecting output to 'testcase-out.txt'", ".timeout MS Try opening locked tables for MS milliseconds", ".timer on|off Turn SQL timer on or off", - ".trace FILE|off Output each SQL statement as it is run", +#ifndef SQLITE_OMIT_TRACE + ".trace ?OPTIONS? Output each SQL statement as it is run", + " FILE Send output to FILE", + " stdout Send output to stdout", + " stderr Send output to stderr", + " off Disable tracing", + " --expanded Expand query parameters", +#ifdef SQLITE_ENABLE_NORMALIZE + " --normalized Normal the SQL statements", +#endif + " --plain Show SQL as it is input", + " --stmt Trace statement execution (SQLITE_TRACE_STMT)", + " --profile Profile statements (SQLITE_TRACE_PROFILE)", + " --row Trace each row (SQLITE_TRACE_ROW)", + " --close Trace connection close (SQLITE_TRACE_CLOSE)", +#endif /* SQLITE_OMIT_TRACE */ ".vfsinfo ?AUX? Information about the top-level VFS", ".vfslist List all available VFSes", ".vfsname ?AUX? Print the name of the VFS stack", @@ -3570,7 +3647,7 @@ static int showHelp(FILE *out, const char *zPattern){ } /* Forward reference */ -static int process_input(ShellState *p, FILE *in); +static int process_input(ShellState *p); /* ** Read the content of file zName into memory obtained from sqlite3_malloc64() @@ -3700,6 +3777,94 @@ int deduceDatabaseType(const char *zName, int dfltZip){ return rc; } +#ifdef SQLITE_ENABLE_DESERIALIZE +/* +** Reconstruct an in-memory database using the output from the "dbtotxt" +** program. Read content from the file in p->zDbFilename. If p->zDbFilename +** is 0, then read from standard input. +*/ +static unsigned char *readHexDb(ShellState *p, int *pnData){ + unsigned char *a = 0; + int nLine; + int n = 0; + int pgsz = 0; + int iOffset = 0; + int j, k; + int rc; + FILE *in; + unsigned char x[16]; + char zLine[1000]; + if( p->zDbFilename ){ + in = fopen(p->zDbFilename, "r"); + if( in==0 ){ + utf8_printf(stderr, "cannot open \"%s\" for reading\n", p->zDbFilename); + return 0; + } + nLine = 0; + }else{ + in = p->in; + nLine = p->lineno; + } + *pnData = 0; + nLine++; + if( fgets(zLine, sizeof(zLine), in)==0 ) goto readHexDb_error; + rc = sscanf(zLine, "| size %d pagesize %d", &n, &pgsz); + if( rc!=2 ) goto readHexDb_error; + if( n<=0 ) goto readHexDb_error; + a = sqlite3_malloc( n ); + if( a==0 ){ + utf8_printf(stderr, "Out of memory!\n"); + goto readHexDb_error; + } + memset(a, 0, n); + if( pgsz<512 || pgsz>65536 || (pgsz & (pgsz-1))!=0 ){ + utf8_printf(stderr, "invalid pagesize\n"); + goto readHexDb_error; + } + for(nLine++; fgets(zLine, sizeof(zLine), in)!=0; nLine++){ + rc = sscanf(zLine, "| page %d offset %d", &j, &k); + if( rc==2 ){ + iOffset = k; + continue; + } + if( strncmp(zLine, "| end ", 6)==0 ){ + break; + } + rc = sscanf(zLine,"| %d: %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx" + " %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx", + &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7], + &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]); + if( rc==17 ){ + k = iOffset+j; + if( k+16<=n ){ + memcpy(a+k, x, 16); + } + } + } + *pnData = n; + if( in!=p->in ){ + fclose(in); + }else{ + p->lineno = nLine; + } + return a; + +readHexDb_error: + if( in!=stdin ){ + fclose(in); + }else{ + while( fgets(zLine, sizeof(zLine), p->in)!=0 ){ + nLine++; + if(strncmp(zLine, "| end ", 6)==0 ) break; + } + p->lineno = nLine; + } + sqlite3_free(a); + utf8_printf(stderr,"Error on line %d of --hexdb input\n", nLine); + return 0; +} +#endif /* SQLITE_ENABLE_DESERIALIZE */ + /* Flags for open_db(). ** ** The default behavior of open_db() is to exit(1) if the database fails to @@ -3733,6 +3898,7 @@ static void open_db(ShellState *p, int openFlags){ SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE, "apndvfs"); break; } + case SHELL_OPEN_HEXDB: case SHELL_OPEN_DESERIALIZE: { sqlite3_open(0, &p->db); break; @@ -3755,7 +3921,10 @@ static void open_db(ShellState *p, int openFlags){ if( p->db==0 || SQLITE_OK!=sqlite3_errcode(p->db) ){ utf8_printf(stderr,"Error: unable to open database \"%s\": %s\n", p->zDbFilename, sqlite3_errmsg(p->db)); - if( openFlags & OPEN_DB_KEEPALIVE ) return; + if( openFlags & OPEN_DB_KEEPALIVE ){ + sqlite3_open(":memory:", &p->db); + return; + } exit(1); } #ifndef SQLITE_OMIT_LOAD_EXTENSION @@ -3787,15 +3956,29 @@ static void open_db(ShellState *p, int openFlags){ sqlite3_free(zSql); } #ifdef SQLITE_ENABLE_DESERIALIZE - else if( p->openMode==SHELL_OPEN_DESERIALIZE ){ + else + if( p->openMode==SHELL_OPEN_DESERIALIZE || p->openMode==SHELL_OPEN_HEXDB ){ + int rc; int nData = 0; - unsigned char *aData = (unsigned char*)readFile(p->zDbFilename, &nData); - int rc = sqlite3_deserialize(p->db, "main", aData, nData, nData, + unsigned char *aData; + if( p->openMode==SHELL_OPEN_DESERIALIZE ){ + aData = (unsigned char*)readFile(p->zDbFilename, &nData); + }else{ + aData = readHexDb(p, &nData); + if( aData==0 ){ + utf8_printf(stderr, "Error in hexdb input\n"); + return; + } + } + rc = sqlite3_deserialize(p->db, "main", aData, nData, nData, SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE); if( rc ){ utf8_printf(stderr, "Error: sqlite3_deserialize() returns %d\n", rc); } + if( p->szMax>0 ){ + sqlite3_file_control(p->db, "main", SQLITE_FCNTL_SIZE_LIMIT, &p->szMax); + } } #endif } @@ -3999,24 +4182,60 @@ static FILE *output_file_open(const char *zFile, int bTextMode){ return f; } -#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT) +#ifndef SQLITE_OMIT_TRACE /* ** A routine for handling output from sqlite3_trace(). */ static int sql_trace_callback( - unsigned mType, - void *pArg, - void *pP, - void *pX + unsigned mType, /* The trace type */ + void *pArg, /* The ShellState pointer */ + void *pP, /* Usually a pointer to sqlite_stmt */ + void *pX /* Auxiliary output */ ){ - FILE *f = (FILE*)pArg; - UNUSED_PARAMETER(mType); - UNUSED_PARAMETER(pP); - if( f ){ - const char *z = (const char*)pX; - int i = strlen30(z); - while( i>0 && z[i-1]==';' ){ i--; } - utf8_printf(f, "%.*s;\n", i, z); + ShellState *p = (ShellState*)pArg; + sqlite3_stmt *pStmt; + const char *zSql; + int nSql; + if( p->traceOut==0 ) return 0; + if( mType==SQLITE_TRACE_CLOSE ){ + utf8_printf(p->traceOut, "-- closing database connection\n"); + return 0; + } + if( mType!=SQLITE_TRACE_ROW && ((const char*)pX)[0]=='-' ){ + zSql = (const char*)pX; + }else{ + pStmt = (sqlite3_stmt*)pP; + switch( p->eTraceType ){ + case SHELL_TRACE_EXPANDED: { + zSql = sqlite3_expanded_sql(pStmt); + break; + } +#ifdef SQLITE_ENABLE_NORMALIZE + case SHELL_TRACE_NORMALIZED: { + zSql = sqlite3_normalized_sql(pStmt); + break; + } +#endif + default: { + zSql = sqlite3_sql(pStmt); + break; + } + } + } + if( zSql==0 ) return 0; + nSql = strlen30(zSql); + while( nSql>0 && zSql[nSql-1]==';' ){ nSql--; } + switch( mType ){ + case SQLITE_TRACE_ROW: + case SQLITE_TRACE_STMT: { + utf8_printf(p->traceOut, "%.*s;\n", nSql, zSql); + break; + } + case SQLITE_TRACE_PROFILE: { + sqlite3_int64 nNanosec = *(sqlite3_int64*)pX; + utf8_printf(p->traceOut, "%.*s; -- %lld ns\n", nSql, zSql, nNanosec); + break; + } } return 0; } @@ -5583,7 +5802,7 @@ static int arCreateOrUpdateCommand( } end_ar_transaction: if( rc!=SQLITE_OK ){ - arExecSql(pAr, "ROLLBACK TO ar; RELEASE ar;"); + sqlite3_exec(pAr->db, "ROLLBACK TO ar; RELEASE ar;", 0, 0, 0); }else{ rc = arExecSql(pAr, "RELEASE ar;"); if( pAr->bZip && pAr->zFile ){ @@ -5782,6 +6001,7 @@ static int do_meta_command(char *zLine, ShellState *p){ sqlite3 *pDest; sqlite3_backup *pBackup; int j; + int bAsync = 0; const char *zVfs = 0; for(j=1; jdb, zDb); if( pBackup==0 ){ @@ -6081,18 +6308,30 @@ static int do_meta_command(char *zLine, ShellState *p){ if( c=='e' && strncmp(azArg[0], "eqp", n)==0 ){ if( nArg==2 ){ p->autoEQPtest = 0; + if( p->autoEQPtrace ){ + if( p->db ) sqlite3_exec(p->db, "PRAGMA vdbe_trace=OFF;", 0, 0, 0); + p->autoEQPtrace = 0; + } if( strcmp(azArg[1],"full")==0 ){ p->autoEQP = AUTOEQP_full; }else if( strcmp(azArg[1],"trigger")==0 ){ p->autoEQP = AUTOEQP_trigger; +#ifdef SQLITE_DEBUG }else if( strcmp(azArg[1],"test")==0 ){ p->autoEQP = AUTOEQP_on; p->autoEQPtest = 1; + }else if( strcmp(azArg[1],"trace")==0 ){ + p->autoEQP = AUTOEQP_full; + p->autoEQPtrace = 1; + open_db(p, 0); + sqlite3_exec(p->db, "SELECT name FROM sqlite_master LIMIT 1", 0, 0, 0); + sqlite3_exec(p->db, "PRAGMA vdbe_trace=ON;", 0, 0, 0); +#endif }else{ p->autoEQP = (u8)booleanValue(azArg[1]); } }else{ - raw_printf(stderr, "Usage: .eqp off|on|trigger|full\n"); + raw_printf(stderr, "Usage: .eqp off|on|trace|trigger|full\n"); rc = 1; } }else @@ -6666,6 +6905,7 @@ static int do_meta_command(char *zLine, ShellState *p){ sqlite3_free(p->zFreeOnClose); p->zFreeOnClose = 0; p->openMode = SHELL_OPEN_UNSPEC; + p->szMax = 0; /* Check for command-line arguments */ for(iName=1; iNameopenMode = SHELL_OPEN_DESERIALIZE; -#endif + }else if( optionMatch(z, "hexdb") ){ + p->openMode = SHELL_OPEN_HEXDB; + }else if( optionMatch(z, "maxsize") && iName+1szMax = integerValue(azArg[++iName]); +#endif /* SQLITE_ENABLE_DESERIALIZE */ }else if( z[0]=='-' ){ utf8_printf(stderr, "unknown option: %s\n", z); rc = 1; @@ -6691,7 +6935,7 @@ static int do_meta_command(char *zLine, ShellState *p){ } /* If a filename is specified, try to open it first */ zNewFilename = nArg>iName ? sqlite3_mprintf("%s", azArg[iName]) : 0; - if( zNewFilename ){ + if( zNewFilename || p->openMode==SHELL_OPEN_HEXDB ){ if( newFlag ) shellDeleteFile(zNewFilename); p->zDbFilename = zNewFilename; open_db(p, OPEN_DB_KEEPALIVE); @@ -6793,6 +7037,52 @@ static int do_meta_command(char *zLine, ShellState *p){ raw_printf(p->out, "\n"); }else +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + if( c=='p' && n>=3 && strncmp(azArg[0], "progress", n)==0 ){ + int i; + int nn = 0; + p->flgProgress = 0; + p->mxProgress = 0; + p->nProgress = 0; + for(i=1; iflgProgress |= SHELL_PROGRESS_QUIET; + continue; + } + if( strcmp(z,"reset")==0 ){ + p->flgProgress |= SHELL_PROGRESS_RESET; + continue; + } + if( strcmp(z,"once")==0 ){ + p->flgProgress |= SHELL_PROGRESS_ONCE; + continue; + } + if( strcmp(z,"limit")==0 ){ + if( i+1>=nArg ){ + utf8_printf(stderr, "Error: missing argument on --limit\n"); + rc = 1; + goto meta_command_exit; + }else{ + p->mxProgress = (int)integerValue(azArg[++i]); + } + continue; + } + utf8_printf(stderr, "Error: unknown option: \"%s\"\n", azArg[i]); + rc = 1; + goto meta_command_exit; + }else{ + nn = (int)integerValue(z); + } + } + open_db(p, 0); + sqlite3_progress_handler(p->db, nn, progress_handler, p); + }else +#endif /* SQLITE_OMIT_PROGRESS_CALLBACK */ + if( c=='p' && strncmp(azArg[0], "prompt", n)==0 ){ if( nArg >= 2) { strncpy(mainPrompt,azArg[1],(int)ArraySize(mainPrompt)-1); @@ -6807,20 +7097,23 @@ static int do_meta_command(char *zLine, ShellState *p){ }else if( c=='r' && n>=3 && strncmp(azArg[0], "read", n)==0 ){ - FILE *alt; + FILE *inSaved = p->in; + int savedLineno = p->lineno; if( nArg!=2 ){ raw_printf(stderr, "Usage: .read FILE\n"); rc = 1; goto meta_command_exit; } - alt = fopen(azArg[1], "rb"); - if( alt==0 ){ + p->in = fopen(azArg[1], "rb"); + if( p->in==0 ){ utf8_printf(stderr,"Error: cannot open \"%s\"\n", azArg[1]); rc = 1; }else{ - rc = process_input(p, alt); - fclose(alt); + rc = process_input(p); + fclose(p->in); } + p->in = inSaved; + p->lineno = savedLineno; }else if( c=='r' && n>=3 && strncmp(azArg[0], "restore", n)==0 ){ @@ -7838,23 +8131,55 @@ static int do_meta_command(char *zLine, ShellState *p){ } }else +#ifndef SQLITE_OMIT_TRACE if( c=='t' && strncmp(azArg[0], "trace", n)==0 ){ + int mType = 0; + int jj; open_db(p, 0); - if( nArg!=2 ){ - raw_printf(stderr, "Usage: .trace FILE|off\n"); - rc = 1; - goto meta_command_exit; + for(jj=1; jjeTraceType = SHELL_TRACE_EXPANDED; + } +#ifdef SQLITE_ENABLE_NORMALIZE + else if( optionMatch(z, "normalized") ){ + p->eTraceType = SHELL_TRACE_NORMALIZED; + } +#endif + else if( optionMatch(z, "plain") ){ + p->eTraceType = SHELL_TRACE_PLAIN; + } + else if( optionMatch(z, "profile") ){ + mType |= SQLITE_TRACE_PROFILE; + } + else if( optionMatch(z, "row") ){ + mType |= SQLITE_TRACE_ROW; + } + else if( optionMatch(z, "stmt") ){ + mType |= SQLITE_TRACE_STMT; + } + else if( optionMatch(z, "close") ){ + mType |= SQLITE_TRACE_CLOSE; + } + else { + raw_printf(stderr, "Unknown option \"%s\" on \".trace\"\n", z); + rc = 1; + goto meta_command_exit; + } + }else{ + output_file_close(p->traceOut); + p->traceOut = output_file_open(azArg[1], 0); + } } - output_file_close(p->traceOut); - p->traceOut = output_file_open(azArg[1], 0); -#if !defined(SQLITE_OMIT_TRACE) && !defined(SQLITE_OMIT_FLOATING_POINT) if( p->traceOut==0 ){ sqlite3_trace_v2(p->db, 0, 0, 0); }else{ - sqlite3_trace_v2(p->db, SQLITE_TRACE_STMT, sql_trace_callback,p->traceOut); + if( mType==0 ) mType = SQLITE_TRACE_STMT; + sqlite3_trace_v2(p->db, mType, sql_trace_callback, p); } -#endif }else +#endif /* !defined(SQLITE_OMIT_TRACE) */ #if SQLITE_USER_AUTHENTICATION if( c=='u' && strncmp(azArg[0], "user", n)==0 ){ @@ -8093,6 +8418,7 @@ static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ open_db(p, 0); if( ShellHasFlag(p,SHFLG_Backslash) ) resolve_backslashes(zSql); + if( p->flgProgress & SHELL_PROGRESS_RESET ) p->nProgress = 0; BEGIN_TIMER; rc = shell_exec(p, zSql, &zErrMsg); END_TIMER; @@ -8129,7 +8455,7 @@ static int runOneSqlLine(ShellState *p, char *zSql, FILE *in, int startline){ ** ** Return the number of errors. */ -static int process_input(ShellState *p, FILE *in){ +static int process_input(ShellState *p){ char *zLine = 0; /* A single input line */ char *zSql = 0; /* Accumulated SQL text */ int nLine; /* Length of current line */ @@ -8138,22 +8464,22 @@ static int process_input(ShellState *p, FILE *in){ int nSqlPrior = 0; /* Bytes of zSql[] used by prior line */ int rc; /* Error code */ int errCnt = 0; /* Number of errors seen */ - int lineno = 0; /* Current line number */ int startline = 0; /* Line number for start of current input */ - while( errCnt==0 || !bail_on_error || (in==0 && stdin_is_interactive) ){ + p->lineno = 0; + while( errCnt==0 || !bail_on_error || (p->in==0 && stdin_is_interactive) ){ fflush(p->out); - zLine = one_input_line(in, zLine, nSql>0); + zLine = one_input_line(p->in, zLine, nSql>0); if( zLine==0 ){ /* End of input */ - if( in==0 && stdin_is_interactive ) printf("\n"); + if( p->in==0 && stdin_is_interactive ) printf("\n"); break; } if( seenInterrupt ){ - if( in!=0 ) break; + if( p->in!=0 ) break; seenInterrupt = 0; } - lineno++; + p->lineno++; if( nSql==0 && _all_whitespace(zLine) ){ if( ShellHasFlag(p, SHFLG_Echo) ) printf("%s\n", zLine); continue; @@ -8185,7 +8511,7 @@ static int process_input(ShellState *p, FILE *in){ for(i=0; zLine[i] && IsSpace(zLine[i]); i++){} assert( nAlloc>0 && zSql!=0 ); memcpy(zSql, zLine+i, nLine+1-i); - startline = lineno; + startline = p->lineno; nSql = nLine-i; }else{ zSql[nSql++] = '\n'; @@ -8194,7 +8520,7 @@ static int process_input(ShellState *p, FILE *in){ } if( nSql && line_contains_semicolon(&zSql[nSqlPrior], nSql-nSqlPrior) && sqlite3_complete(zSql) ){ - errCnt += runOneSqlLine(p, zSql, in, startline); + errCnt += runOneSqlLine(p, zSql, p->in, startline); nSql = 0; if( p->outCount ){ output_reset(p); @@ -8208,7 +8534,7 @@ static int process_input(ShellState *p, FILE *in){ } } if( nSql && !_all_whitespace(zSql) ){ - errCnt += runOneSqlLine(p, zSql, in, startline); + errCnt += runOneSqlLine(p, zSql, p->in, startline); } free(zSql); free(zLine); @@ -8297,7 +8623,8 @@ static void process_sqliterc( char *home_dir = NULL; const char *sqliterc = sqliterc_override; char *zBuf = 0; - FILE *in = NULL; + FILE *inSaved = p->in; + int savedLineno = p->lineno; if (sqliterc == NULL) { home_dir = find_home_dir(0); @@ -8309,14 +8636,16 @@ static void process_sqliterc( zBuf = sqlite3_mprintf("%s/.sqliterc",home_dir); sqliterc = zBuf; } - in = fopen(sqliterc,"rb"); - if( in ){ + p->in = fopen(sqliterc,"rb"); + if( p->in ){ if( stdin_is_interactive ){ utf8_printf(stderr,"-- Loading resources from %s\n",sqliterc); } - process_input(p,in); - fclose(in); + process_input(p); + fclose(p->in); } + p->in = inSaved; + p->lineno = savedLineno; sqlite3_free(zBuf); } @@ -8334,6 +8663,9 @@ static const char zOptions[] = " -column set output mode to 'column'\n" " -cmd COMMAND run \"COMMAND\" before reading stdin\n" " -csv set output mode to 'csv'\n" +#if defined(SQLITE_ENABLE_DESERIALIZE) + " -deserialize open the database using sqlite3_deserialize()\n" +#endif " -echo print commands before execution\n" " -init FILENAME read/process named file\n" " -[no]header turn headers on or off\n" @@ -8346,6 +8678,10 @@ static const char zOptions[] = " -line set output mode to 'line'\n" " -list set output mode to 'list'\n" " -lookaside SIZE N use N entries of SZ bytes for lookaside memory\n" +#if defined(SQLITE_ENABLE_DESERIALIZE) + " -maxsize N maximum size for a --deserialize database\n" +#endif + " -memtrace trace all memory allocations and deallocations\n" " -mmap N default mmap size set to N\n" #ifdef SQLITE_ENABLE_MULTIPLEX " -multiplex enable the multiplexor VFS\n" @@ -8656,6 +8992,8 @@ int SQLITE_CDECL wmain(int argc, wchar_t **wargv){ #ifdef SQLITE_ENABLE_DESERIALIZE }else if( strcmp(z,"-deserialize")==0 ){ data.openMode = SHELL_OPEN_DESERIALIZE; + }else if( strcmp(z,"-maxsize")==0 && i+1[[SQLITE_FCNTL_SIZE_LIMIT]] +** The [SQLITE_FCNTL_SIZE_LIMIT] opcode is used by in-memory VFS that +** implements [sqlite3_deserialize()] to set an upper bound on the size +** of the in-memory database. The argument is a pointer to a [sqlite3_int64]. +** If the integer pointed to is negative, then it is filled in with the +** current limit. Otherwise the limit is set to the larger of the value +** of the integer pointed to and the current database size. The integer +** pointed to is set to the new limit. +** **
  • [[SQLITE_FCNTL_CHUNK_SIZE]] ** The [SQLITE_FCNTL_CHUNK_SIZE] opcode is used to request that the VFS ** extends and truncates the database file in chunks of a size specified @@ -1131,6 +1140,7 @@ struct sqlite3_io_methods { #define SQLITE_FCNTL_ROLLBACK_ATOMIC_WRITE 33 #define SQLITE_FCNTL_LOCK_TIMEOUT 34 #define SQLITE_FCNTL_DATA_VERSION 35 +#define SQLITE_FCNTL_SIZE_LIMIT 36 /* deprecated names */ #define SQLITE_GET_LOCKPROXYFILE SQLITE_FCNTL_GET_LOCKPROXYFILE @@ -1972,6 +1982,17 @@ struct sqlite3_mem_methods { ** negative value for this option restores the default behaviour. ** This option is only available if SQLite is compiled with the ** [SQLITE_ENABLE_SORTER_REFERENCES] compile-time option. +** +** [[SQLITE_CONFIG_MEMDB_MAXSIZE]] +**
    SQLITE_CONFIG_MEMDB_MAXSIZE +**
    The SQLITE_CONFIG_MEMDB_MAXSIZE option accepts a single parameter +** [sqlite3_int64] parameter which is the default maximum size for an in-memory +** database created using [sqlite3_deserialize()]. This default maximum +** size can be adjusted up or down for individual databases using the +** [SQLITE_FCNTL_SIZE_LIMIT] [sqlite3_file_control|file-control]. If this +** configuration setting is never used, then the default maximum is determined +** by the [SQLITE_MEMDB_DEFAULT_MAXSIZE] compile-time option. If that +** compile-time option is not set, then the default maximum is 1073741824. ** */ #define SQLITE_CONFIG_SINGLETHREAD 1 /* nil */ @@ -2002,6 +2023,7 @@ struct sqlite3_mem_methods { #define SQLITE_CONFIG_STMTJRNL_SPILL 26 /* int nByte */ #define SQLITE_CONFIG_SMALL_MALLOC 27 /* boolean */ #define SQLITE_CONFIG_SORTERREF_SIZE 28 /* int nByte */ +#define SQLITE_CONFIG_MEMDB_MAXSIZE 29 /* sqlite3_int64 */ /* ** CAPI3REF: Database Connection Configuration Options @@ -2991,9 +3013,9 @@ int sqlite3_set_authorizer( ** time is in units of nanoseconds, however the current implementation ** is only capable of millisecond resolution so the six least significant ** digits in the time are meaningless. Future versions of SQLite -** might provide greater resolution on the profiler callback. The -** sqlite3_profile() function is considered experimental and is -** subject to change in future versions of SQLite. +** might provide greater resolution on the profiler callback. Invoking +** either [sqlite3_trace()] or [sqlite3_trace_v2()] will cancel the +** profile callback. */ SQLITE_DEPRECATED void *sqlite3_trace(sqlite3*, void(*xTrace)(void*,const char*), void*); @@ -3407,6 +3429,8 @@ int sqlite3_open_v2( ** is not a database file pathname pointer that SQLite passed into the xOpen ** VFS method, then the behavior of this routine is undefined and probably ** undesirable. +** +** See the [URI filename] documentation for additional information. */ const char *sqlite3_uri_parameter(const char *zFilename, const char *zParam); int sqlite3_uri_boolean(const char *zFile, const char *zParam, int bDefault); @@ -3629,18 +3653,23 @@ int sqlite3_limit(sqlite3*, int id, int newVal); ** deplete the limited store of lookaside memory. Future versions of ** SQLite may act on this hint differently. ** -** [[SQLITE_PREPARE_NORMALIZE]] ^(
    SQLITE_PREPARE_NORMALIZE
    -**
    The SQLITE_PREPARE_NORMALIZE flag indicates that a normalized -** representation of the SQL statement should be calculated and then -** associated with the prepared statement, which can be obtained via -** the [sqlite3_normalized_sql()] interface.)^ The semantics used to -** normalize a SQL statement are unspecified and subject to change. -** At a minimum, literal values will be replaced with suitable -** placeholders. +** [[SQLITE_PREPARE_NORMALIZE]]
    SQLITE_PREPARE_NORMALIZE
    +**
    The SQLITE_PREPARE_NORMALIZE flag is a no-op. This flag used +** to be required for any prepared statement that wanted to use the +** [sqlite3_normalized_sql()] interface. However, the +** [sqlite3_normalized_sql()] interface is now available to all +** prepared statements, regardless of whether or not they use this +** flag. +** +** [[SQLITE_PREPARE_NO_VTAB]]
    SQLITE_PREPARE_NO_VTAB
    +**
    The SQLITE_PREPARE_NO_VTAB flag causes the SQL compiler +** to return an error (error code SQLITE_ERROR) if the statement uses +** any virtual tables. ** */ #define SQLITE_PREPARE_PERSISTENT 0x01 #define SQLITE_PREPARE_NORMALIZE 0x02 +#define SQLITE_PREPARE_NO_VTAB 0x04 /* ** CAPI3REF: Compiling An SQL Statement diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 051aa40..774d3e5 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -1356,10 +1356,13 @@ void sqlite3CryptFunc(sqlite3_context*,int,sqlite3_value**); /* This is an extra SQLITE_TRACE macro that indicates "legacy" tracing ** in the style of sqlite3_trace() */ -#define SQLITE_TRACE_LEGACY 0x80 +#define SQLITE_TRACE_LEGACY 0x40 /* Use the legacy xTrace */ +#define SQLITE_TRACE_XPROFILE 0x80 /* Use the legacy xProfile */ #else -#define SQLITE_TRACE_LEGACY 0 +#define SQLITE_TRACE_LEGACY 0 +#define SQLITE_TRACE_XPROFILE 0 #endif /* SQLITE_OMIT_DEPRECATED */ +#define SQLITE_TRACE_NONLEGACY_MASK 0x0f /* Normal flags */ /* @@ -1418,8 +1421,10 @@ struct sqlite3 { void **aExtension; /* Array of shared library handles */ int (*xTrace)(u32,void*,void*,void*); /* Trace function */ void *pTraceArg; /* Argument to the trace function */ +#ifndef SQLITE_OMIT_DEPRECATED void (*xProfile)(void*,const char*,u64); /* Profiling function */ void *pProfileArg; /* Argument to profile function */ +#endif void *pCommitArg; /* Argument to xCommitCallback() */ int (*xCommitCallback)(void*); /* Invoked at every commit. */ void *pRollbackArg; /* Argument to xRollbackCallback() */ @@ -1550,6 +1555,7 @@ struct sqlite3 { #define SQLITE_VdbeTrace HI(0x0004) /* True to trace VDBE execution */ #define SQLITE_VdbeAddopTrace HI(0x0008) /* Trace sqlite3VdbeAddOp() calls */ #define SQLITE_VdbeEQP HI(0x0010) /* Debug EXPLAIN QUERY PLAN */ +#define SQLITE_ParserTrace HI(0x0020) /* PRAGMA parser_trace=ON */ #endif /* @@ -1952,9 +1958,6 @@ struct VTable { struct Table { char *zName; /* Name of the table or view */ Column *aCol; /* Information about each column */ -#ifdef SQLITE_ENABLE_NORMALIZE - Hash *pColHash; /* All columns indexed by name */ -#endif Index *pIndex; /* List of SQL indexes on this table. */ Select *pSelect; /* NULL for tables. Points to definition if a view. */ FKey *pFKey; /* Linked list of all foreign keys in this table */ @@ -2241,7 +2244,7 @@ struct Index { u16 nKeyCol; /* Number of columns forming the key */ u16 nColumn; /* Number of columns stored in the index */ u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */ - unsigned idxType:2; /* 1==UNIQUE, 2==PRIMARY KEY, 0==CREATE INDEX */ + unsigned idxType:2; /* 0:Normal 1:UNIQUE, 2:PRIMARY KEY, 3:IPK */ unsigned bUnordered:1; /* Use this index for == or IN queries only */ unsigned uniqNotNull:1; /* True if UNIQUE and NOT NULL for all columns */ unsigned isResized:1; /* True if resizeIndexObject() has been called */ @@ -2266,6 +2269,7 @@ struct Index { #define SQLITE_IDXTYPE_APPDEF 0 /* Created using CREATE INDEX */ #define SQLITE_IDXTYPE_UNIQUE 1 /* Implements a UNIQUE constraint */ #define SQLITE_IDXTYPE_PRIMARYKEY 2 /* Is the PRIMARY KEY for the table */ +#define SQLITE_IDXTYPE_IPK 3 /* INTEGER PRIMARY KEY index */ /* Return true if index X is a PRIMARY KEY index */ #define IsPrimaryKeyIndex(X) ((X)->idxType==SQLITE_IDXTYPE_PRIMARYKEY) @@ -2483,6 +2487,10 @@ struct Expr { Table *pTab; /* TK_COLUMN: Table containing column. Can be NULL ** for a column of an index on an expression */ Window *pWin; /* TK_FUNCTION: Window definition for the func */ + struct { /* TK_IN, TK_SELECT, and TK_EXISTS */ + int iAddr; /* Subroutine entry address */ + int regReturn; /* Register used to hold return address */ + } sub; } y; }; @@ -2514,6 +2522,8 @@ struct Expr { #define EP_Alias 0x400000 /* Is an alias for a result set column */ #define EP_Leaf 0x800000 /* Expr.pLeft, .pRight, .u.pSelect all NULL */ #define EP_WinFunc 0x1000000 /* TK_FUNCTION with Expr.y.pWin set */ +#define EP_Subrtn 0x2000000 /* Uses Expr.y.sub. TK_IN, _SELECT, or _EXISTS */ +#define EP_Quoted 0x4000000 /* TK_ID was originally quoted */ /* ** The EP_Propagate mask is a set of properties that automatically propagate @@ -3057,16 +3067,17 @@ struct Parse { u8 hasCompound; /* Need to invoke convertCompoundSelectToSubquery() */ u8 okConstFactor; /* OK to factor out constants */ u8 disableLookaside; /* Number of times lookaside has been disabled */ + u8 disableVtab; /* Disable all virtual tables for this parse */ int nRangeReg; /* Size of the temporary register block */ int iRangeReg; /* First register in temporary register block */ int nErr; /* Number of errors seen */ int nTab; /* Number of previously allocated VDBE cursors */ int nMem; /* Number of memory cells used so far */ - int nOpAlloc; /* Number of slots allocated for Vdbe.aOp[] */ int szOpAlloc; /* Bytes of memory space allocated for Vdbe.aOp[] */ int iSelfTab; /* Table associated with an index on expr, or negative ** of the base register during check-constraint eval */ - int nLabel; /* Number of labels used */ + int nLabel; /* The *negative* of the number of labels used */ + int nLabelAlloc; /* Number of slots in aLabel */ int *aLabel; /* Space to hold the labels */ ExprList *pConstExpr;/* Constant expressions */ Token constraintName;/* Name of the constraint currently being parsed */ @@ -3126,7 +3137,9 @@ struct Parse { Vdbe *pReprepare; /* VM being reprepared (sqlite3Reprepare()) */ const char *zTail; /* All SQL text past the last semicolon parsed */ Table *pNewTable; /* A table being constructed by CREATE TABLE */ - Index *pNewIndex; /* An index being constructed by CREATE INDEX */ + Index *pNewIndex; /* An index being constructed by CREATE INDEX. + ** Also used to hold redundant UNIQUE constraints + ** during a RENAME COLUMN */ Trigger *pNewTrigger; /* Trigger under construct by a CREATE TRIGGER */ const char *zAuthContext; /* The 6th parameter to db->xAuth callbacks */ #ifndef SQLITE_OMIT_VIRTUALTABLE @@ -3354,6 +3367,7 @@ typedef struct { int iDb; /* 0 for main database. 1 for TEMP, 2.. for ATTACHed */ int rc; /* Result code stored here */ u32 mInitFlags; /* Flags controlling error messages */ + u32 nInitRow; /* Number of rows processed */ } InitData; /* @@ -3414,6 +3428,9 @@ struct Sqlite3Config { void (*xVdbeBranch)(void*,unsigned iSrcLine,u8 eThis,u8 eMx); /* Callback */ void *pVdbeBranchArg; /* 1st argument */ #endif +#ifdef SQLITE_ENABLE_DESERIALIZE + sqlite3_int64 mxMemdbSize; /* Default max memdb size */ +#endif #ifndef SQLITE_UNTESTABLE int (*xTestCallback)(int); /* Invoked by sqlite3FaultSim() */ #endif @@ -3802,6 +3819,7 @@ char *sqlite3VMPrintf(sqlite3*,const char*, va_list); void sqlite3SetString(char **, sqlite3*, const char*); void sqlite3ErrorMsg(Parse*, const char*, ...); void sqlite3Dequote(char*); +void sqlite3DequoteExpr(Expr*); void sqlite3TokenInit(Token*,char*); int sqlite3KeywordCode(const unsigned char*, int); int sqlite3RunParser(Parse*, const char*, char **); @@ -3830,6 +3848,7 @@ void sqlite3ExprListSetName(Parse*,ExprList*,Token*,int); void sqlite3ExprListSetSpan(Parse*,ExprList*,const char*,const char*); void sqlite3ExprListDelete(sqlite3*, ExprList*); u32 sqlite3ExprListFlags(const ExprList*); +int sqlite3IndexHasDuplicateRootPage(Index*); int sqlite3Init(sqlite3*, char**); int sqlite3InitCallback(void*, int, char**, char**); int sqlite3InitOne(sqlite3*, int, char**, u32); @@ -3863,6 +3882,11 @@ void sqlite3AddCollateType(Parse*, Token*); void sqlite3EndTable(Parse*,Token*,Token*,u8,Select*); int sqlite3ParseUri(const char*,const char*,unsigned int*, sqlite3_vfs**,char**,char **); +#ifdef SQLITE_HAS_CODEC + int sqlite3CodecQueryParameters(sqlite3*,const char*,const char*); +#else +# define sqlite3CodecQueryParameters(A,B,C) 0 +#endif Btree *sqlite3DbNameToBtree(sqlite3*,const char*); #ifdef SQLITE_UNTESTABLE @@ -3915,8 +3939,8 @@ void sqlite3Insert(Parse*, SrcList*, Select*, IdList*, int, Upsert*); void *sqlite3ArrayAllocate(sqlite3*,void*,int,int*,int*); IdList *sqlite3IdListAppend(Parse*, IdList*, Token*); int sqlite3IdListIndex(IdList*,const char*); -SrcList *sqlite3SrcListEnlarge(sqlite3*, SrcList*, int, int); -SrcList *sqlite3SrcListAppend(sqlite3*, SrcList*, Token*, Token*); +SrcList *sqlite3SrcListEnlarge(Parse*, SrcList*, int, int); +SrcList *sqlite3SrcListAppend(Parse*, SrcList*, Token*, Token*); SrcList *sqlite3SrcListAppendFromTerm(Parse*, SrcList*, Token*, Token*, Token*, Select*, Expr*, IdList*); void sqlite3SrcListIndexedBy(Parse *, SrcList *, Token *); @@ -3983,8 +4007,8 @@ Table *sqlite3LocateTableItem(Parse*,u32 flags,struct SrcList_item *); Index *sqlite3FindIndex(sqlite3*,const char*, const char*); void sqlite3UnlinkAndDeleteTable(sqlite3*,int,const char*); void sqlite3UnlinkAndDeleteIndex(sqlite3*,int,const char*); -void sqlite3Vacuum(Parse*,Token*); -int sqlite3RunVacuum(char**, sqlite3*, int); +void sqlite3Vacuum(Parse*,Token*,Expr*); +int sqlite3RunVacuum(char**, sqlite3*, int, sqlite3_value*); char *sqlite3NameFromToken(sqlite3*, Token*); int sqlite3ExprCompare(Parse*,Expr*, Expr*, int); int sqlite3ExprCompareSkip(Expr*, Expr*, int); @@ -4022,9 +4046,6 @@ int sqlite3ExprIsInteger(Expr*, int*); int sqlite3ExprCanBeNull(const Expr*); int sqlite3ExprNeedsNoAffinityChange(const Expr*, char); int sqlite3IsRowid(const char*); -#ifdef SQLITE_ENABLE_NORMALIZE -int sqlite3IsRowidN(const char*, int); -#endif void sqlite3GenerateRowDelete( Parse*,Table*,Trigger*,int,int,int,i16,u8,u8,u8,int); void sqlite3GenerateRowIndexDelete(Parse*, Table*, int, int, int*, int); @@ -4051,9 +4072,7 @@ ExprList *sqlite3ExprListDup(sqlite3*,ExprList*,int); SrcList *sqlite3SrcListDup(sqlite3*,SrcList*,int); IdList *sqlite3IdListDup(sqlite3*,IdList*); Select *sqlite3SelectDup(sqlite3*,Select*,int); -#ifdef SQLITE_ENABLE_NORMALIZE -FuncDef *sqlite3FunctionSearchN(int,const char*,int); -#endif +FuncDef *sqlite3FunctionSearch(int,const char*); void sqlite3InsertBuiltinFuncs(FuncDef*,int); FuncDef *sqlite3FindFunction(sqlite3*,const char*,int,u8,u8); void sqlite3RegisterBuiltinFunctions(void); @@ -4258,19 +4277,17 @@ void sqlite3AlterFunctions(void); void sqlite3AlterRenameTable(Parse*, SrcList*, Token*); void sqlite3AlterRenameColumn(Parse*, SrcList*, Token*, Token*); int sqlite3GetToken(const unsigned char *, int *); -#ifdef SQLITE_ENABLE_NORMALIZE -int sqlite3GetTokenNormalized(const unsigned char *, int *, int *); -#endif void sqlite3NestedParse(Parse*, const char*, ...); void sqlite3ExpirePreparedStatements(sqlite3*, int); -int sqlite3CodeSubselect(Parse*, Expr *, int, int); +void sqlite3CodeRhsOfIN(Parse*, Expr*, int, int); +int sqlite3CodeSubselect(Parse*, Expr*); void sqlite3SelectPrep(Parse*, Select*, NameContext*); void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); int sqlite3MatchSpanName(const char*, const char*, const char*, const char*); int sqlite3ResolveExprNames(NameContext*, Expr*); int sqlite3ResolveExprListNames(NameContext*, ExprList*); void sqlite3ResolveSelectNames(Parse*, Select*, NameContext*); -void sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); +int sqlite3ResolveSelfReference(Parse*,Table*,int,Expr*,ExprList*); int sqlite3ResolveOrderGroupBy(Parse*, Select*, ExprList*, const char*); void sqlite3ColumnDefault(Vdbe *, Table *, int, int); void sqlite3AlterFinishAddColumn(Parse *, Token *); @@ -4419,7 +4436,7 @@ int sqlite3VdbeParameterIndex(Vdbe*, const char*, int); int sqlite3TransferBindings(sqlite3_stmt *, sqlite3_stmt *); void sqlite3ParserReset(Parse*); #ifdef SQLITE_ENABLE_NORMALIZE -void sqlite3Normalize(Vdbe*, const char*, int, u8); +char *sqlite3Normalize(Vdbe*, const char*); #endif int sqlite3Reprepare(Vdbe*); void sqlite3ExprListCheckLength(Parse*, ExprList*, const char*); @@ -4515,7 +4532,7 @@ const char *sqlite3JournalModename(int); #define IN_INDEX_NOOP_OK 0x0001 /* OK to return IN_INDEX_NOOP */ #define IN_INDEX_MEMBERSHIP 0x0002 /* IN operator used for membership test */ #define IN_INDEX_LOOP 0x0004 /* IN operator used as a loop */ -int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*); +int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*, int*); int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int); int sqlite3JournalSize(sqlite3_vfs *); diff --git a/src/tclsqlite.c b/src/tclsqlite.c index 3982ead..eb3bedf 100644 --- a/src/tclsqlite.c +++ b/src/tclsqlite.c @@ -2418,7 +2418,7 @@ static int SQLITE_TCLAPI DbObjCmd( } /* - ** $db deserialize ?DATABASE? VALUE + ** $db deserialize ?-maxsize N? ?-readonly BOOL? ?DATABASE? VALUE ** ** Reopen DATABASE (default "main") using the content in $VALUE */ @@ -2428,38 +2428,65 @@ static int SQLITE_TCLAPI DbObjCmd( (char*)0); rc = TCL_ERROR; #else - const char *zSchema; - Tcl_Obj *pValue; + const char *zSchema = 0; + Tcl_Obj *pValue = 0; unsigned char *pBA; unsigned char *pData; int len, xrc; - - if( objc==3 ){ - zSchema = 0; - pValue = objv[2]; - }else if( objc==4 ){ - zSchema = Tcl_GetString(objv[2]); - pValue = objv[3]; - }else{ + sqlite3_int64 mxSize = 0; + int i; + int isReadonly = 0; + + + if( objc<3 ){ Tcl_WrongNumArgs(interp, 2, objv, "?DATABASE? VALUE"); rc = TCL_ERROR; break; } + for(i=2; i0 ){ Tcl_AppendResult(interp, "out of memory", (char*)0); rc = TCL_ERROR; }else{ + int flags; if( len>0 ) memcpy(pData, pBA, len); - xrc = sqlite3_deserialize(pDb->db, zSchema, pData, len, len, - SQLITE_DESERIALIZE_FREEONCLOSE | - SQLITE_DESERIALIZE_RESIZEABLE); + if( isReadonly ){ + flags = SQLITE_DESERIALIZE_FREEONCLOSE | SQLITE_DESERIALIZE_READONLY; + }else{ + flags = SQLITE_DESERIALIZE_FREEONCLOSE | SQLITE_DESERIALIZE_RESIZEABLE; + } + xrc = sqlite3_deserialize(pDb->db, zSchema, pData, len, len, flags); if( xrc ){ Tcl_AppendResult(interp, "unable to set MEMDB content", (char*)0); rc = TCL_ERROR; } + if( mxSize>0 ){ + sqlite3_file_control(pDb->db, zSchema,SQLITE_FCNTL_SIZE_LIMIT,&mxSize); + } } +deserialize_error: #endif break; } diff --git a/src/test1.c b/src/test1.c index e2048cb..d8a0c86 100644 --- a/src/test1.c +++ b/src/test1.c @@ -7141,6 +7141,9 @@ static int SQLITE_TCLAPI tclLoadStaticExtensionCmd( extern int sqlite3_ieee_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_nextchar_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_percentile_init(sqlite3*,char**,const sqlite3_api_routines*); +#ifndef SQLITE_OMIT_VIRTUALTABLE + extern int sqlite3_prefixes_init(sqlite3*,char**,const sqlite3_api_routines*); +#endif extern int sqlite3_regexp_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_remember_init(sqlite3*,char**,const sqlite3_api_routines*); extern int sqlite3_series_init(sqlite3*,char**,const sqlite3_api_routines*); @@ -7166,6 +7169,9 @@ static int SQLITE_TCLAPI tclLoadStaticExtensionCmd( { "ieee754", sqlite3_ieee_init }, { "nextchar", sqlite3_nextchar_init }, { "percentile", sqlite3_percentile_init }, +#ifndef SQLITE_OMIT_VIRTUALTABLE + { "prefixes", sqlite3_prefixes_init }, +#endif { "regexp", sqlite3_regexp_init }, { "remember", sqlite3_remember_init }, { "series", sqlite3_series_init }, @@ -7641,6 +7647,79 @@ static int SQLITE_TCLAPI test_mmap_warm( } } +/* +** Usage: decode_hexdb TEXT +** +** Example: db deserialize [decode_hexdb $output_of_dbtotxt] +** +** This routine returns a byte-array for an SQLite database file that +** is constructed from a text input which is the output of the "dbtotxt" +** utility. +*/ +static int SQLITE_TCLAPI test_decode_hexdb( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + const char *zIn = 0; + unsigned char *a = 0; + int n = 0; + int lineno = 0; + int i, iNext; + int iOffset = 0; + int j, k; + int rc; + unsigned char x[16]; + if( objc!=2 ){ + Tcl_WrongNumArgs(interp, 1, objv, "HEXDB"); + return TCL_ERROR; + } + zIn = Tcl_GetString(objv[1]); + for(i=0; zIn[i]; i=iNext){ + lineno++; + for(iNext=i; zIn[iNext] && zIn[iNext]!='\n'; iNext++){} + if( zIn[iNext]=='\n' ) iNext++; + while( zIn[i]==' ' || zIn[i]=='\t' ){ i++; } + if( a==0 ){ + int pgsz; + rc = sscanf(zIn+i, "| size %d pagesize %d", &n, &pgsz); + if( rc!=2 ) continue; + if( n<512 ){ + Tcl_AppendResult(interp, "bad 'size' field", (void*)0); + return TCL_ERROR; + } + a = malloc( n ); + if( a==0 ){ + Tcl_AppendResult(interp, "out of memory", (void*)0); + return TCL_ERROR; + } + memset(a, 0, n); + continue; + } + rc = sscanf(zIn+i, "| page %d offset %d", &j, &k); + if( rc==2 ){ + iOffset = k; + continue; + } + rc = sscanf(zIn+i,"| %d: %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx" + " %hhx %hhx %hhx %hhx %hhx %hhx %hhx %hhx", + &j, &x[0], &x[1], &x[2], &x[3], &x[4], &x[5], &x[6], &x[7], + &x[8], &x[9], &x[10], &x[11], &x[12], &x[13], &x[14], &x[15]); + if( rc==17 ){ + k = iOffset+j; + if( k+16<=n ){ + memcpy(a+k, x, 16); + } + continue; + } + } + Tcl_SetObjResult(interp, Tcl_NewByteArrayObj(a, n)); + free(a); + return TCL_OK; +} + + /* ** Register commands with the TCL interpreter. */ @@ -7920,6 +7999,7 @@ int Sqlitetest1_Init(Tcl_Interp *interp){ { "atomic_batch_write", test_atomic_batch_write, 0 }, { "sqlite3_mmap_warm", test_mmap_warm, 0 }, { "sqlite3_config_sorterref", test_config_sorterref, 0 }, + { "decode_hexdb", test_decode_hexdb, 0 }, }; static int bitmask_size = sizeof(Bitmask)*8; static int longdouble_size = sizeof(LONGDOUBLE_TYPE); diff --git a/src/test_journal.c b/src/test_journal.c index 8a449e8..6a040ea 100644 --- a/src/test_journal.c +++ b/src/test_journal.c @@ -560,7 +560,7 @@ static int jtWrite( /* The following assert() statements may fail if this layer is used ** with a connection in "PRAGMA synchronous=off" mode. If they ** fail with sync=normal or sync=full, this may indicate problem. */ - assert( pgno<=p->nPage || p->nSync>0 ); + assert( p->nPage==0 || pgno<=p->nPage || p->nSync>0 ); assert( pgno>p->nPage || sqlite3BitvecTest(p->pWritable, pgno) ); } } diff --git a/src/test_vfs.c b/src/test_vfs.c index 4a98ac2..bf9fa6b 100644 --- a/src/test_vfs.c +++ b/src/test_vfs.c @@ -228,11 +228,13 @@ static int tvfsResultCode(Testvfs *p, int *pRc){ int eCode; const char *zCode; } aCode[] = { - { SQLITE_OK, "SQLITE_OK" }, - { SQLITE_ERROR, "SQLITE_ERROR" }, - { SQLITE_IOERR, "SQLITE_IOERR" }, - { SQLITE_LOCKED, "SQLITE_LOCKED" }, - { SQLITE_BUSY, "SQLITE_BUSY" }, + { SQLITE_OK, "SQLITE_OK" }, + { SQLITE_ERROR, "SQLITE_ERROR" }, + { SQLITE_IOERR, "SQLITE_IOERR" }, + { SQLITE_LOCKED, "SQLITE_LOCKED" }, + { SQLITE_BUSY, "SQLITE_BUSY" }, + { SQLITE_READONLY, "SQLITE_READONLY" }, + { SQLITE_READONLY_CANTINIT, "SQLITE_READONLY_CANTINIT" }, }; const char *z; @@ -865,7 +867,7 @@ static int tvfsShmOpen(sqlite3_file *pFile){ pFd->pNext = pBuffer->pFile; pBuffer->pFile = pFd; pFd->pShm = pBuffer; - return SQLITE_OK; + return rc; } static void tvfsAllocPage(TestvfsBuffer *p, int iPage, int pgsz){ @@ -918,7 +920,9 @@ static int tvfsShmMap( if( rc==SQLITE_OK && isWrite && !pFd->pShm->aPage[iPage] ){ tvfsAllocPage(pFd->pShm, iPage, pgsz); } - *pp = (void volatile *)pFd->pShm->aPage[iPage]; + if( rc==SQLITE_OK || rc==SQLITE_READONLY ){ + *pp = (void volatile *)pFd->pShm->aPage[iPage]; + } return rc; } @@ -1563,8 +1567,115 @@ static int SQLITE_TCLAPI testvfs_cmd( return TCL_ERROR; } +extern int getDbPointer(Tcl_Interp *interp, const char *zA, sqlite3 **ppDb); +extern const char *sqlite3ErrName(int); + +/* +** tclcmd: vfs_shmlock DB DBNAME (shared|exclusive) (lock|unlock) OFFSET N +*/ +static int SQLITE_TCLAPI test_vfs_shmlock( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + const char *azArg1[] = {"shared", "exclusive", 0}; + const char *azArg2[] = {"lock", "unlock", 0}; + sqlite3 *db = 0; + int rc = SQLITE_OK; + const char *zDbname = 0; + int iArg1 = 0; + int iArg2 = 0; + int iOffset = 0; + int n = 0; + sqlite3_file *pFd; + + if( objc!=7 ){ + Tcl_WrongNumArgs(interp, 1, objv, + "DB DBNAME (shared|exclusive) (lock|unlock) OFFSET N" + ); + return TCL_ERROR; + } + + zDbname = Tcl_GetString(objv[2]); + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) + || Tcl_GetIndexFromObj(interp, objv[3], azArg1, "ARG", 0, &iArg1) + || Tcl_GetIndexFromObj(interp, objv[4], azArg2, "ARG", 0, &iArg2) + || Tcl_GetIntFromObj(interp, objv[5], &iOffset) + || Tcl_GetIntFromObj(interp, objv[6], &n) + ){ + return TCL_ERROR; + } + + sqlite3_file_control(db, zDbname, SQLITE_FCNTL_FILE_POINTER, (void*)&pFd); + if( pFd==0 ){ + return TCL_ERROR; + } + rc = pFd->pMethods->xShmLock(pFd, iOffset, n, + (iArg1==0 ? SQLITE_SHM_SHARED : SQLITE_SHM_EXCLUSIVE) + | (iArg2==0 ? SQLITE_SHM_LOCK : SQLITE_SHM_UNLOCK) + ); + Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1)); + return TCL_OK; +} + +static int SQLITE_TCLAPI test_vfs_set_readmark( + void * clientData, + Tcl_Interp *interp, + int objc, + Tcl_Obj *CONST objv[] +){ + sqlite3 *db = 0; + int rc = SQLITE_OK; + const char *zDbname = 0; + int iSlot = 0; + int iVal = -1; + sqlite3_file *pFd; + void volatile *pShm = 0; + u32 *aShm; + int iOff; + + if( objc!=4 && objc!=5 ){ + Tcl_WrongNumArgs(interp, 1, objv, "DB DBNAME SLOT ?VALUE?"); + return TCL_ERROR; + } + + zDbname = Tcl_GetString(objv[2]); + if( getDbPointer(interp, Tcl_GetString(objv[1]), &db) + || Tcl_GetIntFromObj(interp, objv[3], &iSlot) + || (objc==5 && Tcl_GetIntFromObj(interp, objv[4], &iVal)) + ){ + return TCL_ERROR; + } + + sqlite3_file_control(db, zDbname, SQLITE_FCNTL_FILE_POINTER, (void*)&pFd); + if( pFd==0 ){ + return TCL_ERROR; + } + rc = pFd->pMethods->xShmMap(pFd, 0, 32*1024, 0, &pShm); + if( rc!=SQLITE_OK ){ + Tcl_SetObjResult(interp, Tcl_NewStringObj(sqlite3ErrName(rc), -1)); + return TCL_ERROR; + } + if( pShm==0 ){ + Tcl_AppendResult(interp, "*-shm is not yet mapped", 0); + return TCL_ERROR; + } + aShm = (u32*)pShm; + iOff = 12*2+1+iSlot; + + if( objc==5 ){ + aShm[iOff] = iVal; + } + Tcl_SetObjResult(interp, Tcl_NewIntObj(aShm[iOff])); + + return TCL_OK; +} + int Sqlitetestvfs_Init(Tcl_Interp *interp){ Tcl_CreateObjCommand(interp, "testvfs", testvfs_cmd, 0, 0); + Tcl_CreateObjCommand(interp, "vfs_shmlock", test_vfs_shmlock, 0, 0); + Tcl_CreateObjCommand(interp, "vfs_set_readmark", test_vfs_set_readmark, 0, 0); return TCL_OK; } diff --git a/src/tokenize.c b/src/tokenize.c index 05ca86e..2d7b23d 100644 --- a/src/tokenize.c +++ b/src/tokenize.c @@ -545,73 +545,6 @@ int sqlite3GetToken(const unsigned char *z, int *tokenType){ return i; } -#ifdef SQLITE_ENABLE_NORMALIZE -/* -** Return the length (in bytes) of the token that begins at z[0]. -** Store the token type in *tokenType before returning. If flags has -** SQLITE_TOKEN_NORMALIZE flag enabled, use the identifier token type -** for keywords. Add SQLITE_TOKEN_QUOTED to flags if the token was -** actually a quoted identifier. Add SQLITE_TOKEN_KEYWORD to flags -** if the token was recognized as a keyword; this is useful when the -** SQLITE_TOKEN_NORMALIZE flag is used, because it enables the caller -** to differentiate between a keyword being treated as an identifier -** (for normalization purposes) and an actual identifier. -*/ -int sqlite3GetTokenNormalized( - const unsigned char *z, - int *tokenType, - int *flags -){ - int n; - unsigned char iClass = aiClass[*z]; - if( iClass==CC_KYWD ){ - int i; - for(i=1; aiClass[z[i]]<=CC_KYWD; i++){} - if( IdChar(z[i]) ){ - /* This token started out using characters that can appear in keywords, - ** but z[i] is a character not allowed within keywords, so this must - ** be an identifier instead */ - i++; - while( IdChar(z[i]) ){ i++; } - *tokenType = TK_ID; - return i; - } - *tokenType = TK_ID; - n = keywordCode((char*)z, i, tokenType); - /* If the token is no longer considered to be an identifier, then it is a - ** keyword of some kind. Make the token back into an identifier and then - ** set the SQLITE_TOKEN_KEYWORD flag. Several non-identifier tokens are - ** used verbatim, including IN, IS, NOT, and NULL. */ - switch( *tokenType ){ - case TK_ID: { - /* do nothing, handled by caller */ - break; - } - case TK_IN: - case TK_IS: - case TK_NOT: - case TK_NULL: { - *flags |= SQLITE_TOKEN_KEYWORD; - break; - } - default: { - *tokenType = TK_ID; - *flags |= SQLITE_TOKEN_KEYWORD; - break; - } - } - }else{ - n = sqlite3GetToken(z, tokenType); - /* If the token is considered to be an identifier and the character class - ** of the first character is a quote, set the SQLITE_TOKEN_QUOTED flag. */ - if( *tokenType==TK_ID && (iClass==CC_QUOTE || iClass==CC_QUOTE2) ){ - *flags |= SQLITE_TOKEN_QUOTED; - } - } - return n; -} -#endif /* SQLITE_ENABLE_NORMALIZE */ - /* ** Run the parser on the given SQL string. The parser structure is ** passed in. An SQLITE_ status code is returned. If an error occurs @@ -639,7 +572,14 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ pParse->rc = SQLITE_OK; pParse->zTail = zSql; assert( pzErrMsg!=0 ); - /* sqlite3ParserTrace(stdout, "parser: "); */ +#ifdef SQLITE_DEBUG + if( db->flags & SQLITE_ParserTrace ){ + printf("parser: [[[%s]]]\n", zSql); + sqlite3ParserTrace(stdout, "parser: "); + }else{ + sqlite3ParserTrace(0, 0); + } +#endif #ifdef sqlite3Parser_ENGINEALWAYSONSTACK pEngine = &sEngine; sqlite3ParserInit(pEngine, pParse); @@ -781,3 +721,138 @@ int sqlite3RunParser(Parse *pParse, const char *zSql, char **pzErrMsg){ assert( nErr==0 || pParse->rc!=SQLITE_OK ); return nErr; } + + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Insert a single space character into pStr if the current string +** ends with an identifier +*/ +static void addSpaceSeparator(sqlite3_str *pStr){ + if( pStr->nChar && sqlite3IsIdChar(pStr->zText[pStr->nChar-1]) ){ + sqlite3_str_append(pStr, " ", 1); + } +} + +/* +** Compute a normalization of the SQL given by zSql[0..nSql-1]. Return +** the normalization in space obtained from sqlite3DbMalloc(). Or return +** NULL if anything goes wrong or if zSql is NULL. +*/ +char *sqlite3Normalize( + Vdbe *pVdbe, /* VM being reprepared */ + const char *zSql /* The original SQL string */ +){ + sqlite3 *db; /* The database connection */ + int i; /* Next unread byte of zSql[] */ + int n; /* length of current token */ + int tokenType; /* type of current token */ + int prevType = 0; /* Previous non-whitespace token */ + int nParen; /* Number of nested levels of parentheses */ + int iStartIN; /* Start of RHS of IN operator in z[] */ + int nParenAtIN; /* Value of nParent at start of RHS of IN operator */ + int j; /* Bytes of normalized SQL generated so far */ + sqlite3_str *pStr; /* The normalized SQL string under construction */ + + db = sqlite3VdbeDb(pVdbe); + tokenType = -1; + nParen = iStartIN = nParenAtIN = 0; + pStr = sqlite3_str_new(db); + assert( pStr!=0 ); /* sqlite3_str_new() never returns NULL */ + for(i=0; zSql[i] && pStr->accError==0; i+=n){ + if( tokenType!=TK_SPACE ){ + prevType = tokenType; + } + n = sqlite3GetToken((unsigned char*)zSql+i, &tokenType); + if( NEVER(n<=0) ) break; + switch( tokenType ){ + case TK_SPACE: { + break; + } + case TK_NULL: { + if( prevType==TK_IS || prevType==TK_NOT ){ + sqlite3_str_append(pStr, " NULL", 5); + break; + } + /* Fall through */ + } + case TK_STRING: + case TK_INTEGER: + case TK_FLOAT: + case TK_VARIABLE: + case TK_BLOB: { + sqlite3_str_append(pStr, "?", 1); + break; + } + case TK_LP: { + nParen++; + if( prevType==TK_IN ){ + iStartIN = pStr->nChar; + nParenAtIN = nParen; + } + sqlite3_str_append(pStr, "(", 1); + break; + } + case TK_RP: { + if( iStartIN>0 && nParen==nParenAtIN ){ + assert( pStr->nChar>=iStartIN ); + pStr->nChar = iStartIN+1; + sqlite3_str_append(pStr, "?,?,?", 5); + iStartIN = 0; + } + nParen--; + sqlite3_str_append(pStr, ")", 1); + break; + } + case TK_ID: { + iStartIN = 0; + j = pStr->nChar; + if( sqlite3Isquote(zSql[i]) ){ + char *zId = sqlite3DbStrNDup(db, zSql+i, n); + int nId; + int eType = 0; + if( zId==0 ) break; + sqlite3Dequote(zId); + if( zSql[i]=='"' && sqlite3VdbeUsesDoubleQuotedString(pVdbe, zId) ){ + sqlite3_str_append(pStr, "?", 1); + sqlite3DbFree(db, zId); + break; + } + nId = sqlite3Strlen30(zId); + if( sqlite3GetToken((u8*)zId, &eType)==nId && eType==TK_ID ){ + addSpaceSeparator(pStr); + sqlite3_str_append(pStr, zId, nId); + }else{ + sqlite3_str_appendf(pStr, "\"%w\"", zId); + } + sqlite3DbFree(db, zId); + }else{ + addSpaceSeparator(pStr); + sqlite3_str_append(pStr, zSql+i, n); + } + while( jnChar ){ + pStr->zText[j] = sqlite3Tolower(pStr->zText[j]); + j++; + } + break; + } + case TK_SELECT: { + iStartIN = 0; + /* fall through */ + } + default: { + if( sqlite3IsIdChar(zSql[i]) ) addSpaceSeparator(pStr); + j = pStr->nChar; + sqlite3_str_append(pStr, zSql+i, n); + while( jnChar ){ + pStr->zText[j] = sqlite3Toupper(pStr->zText[j]); + j++; + } + break; + } + } + } + if( tokenType!=TK_SEMI ) sqlite3_str_append(pStr, ";", 1); + return sqlite3_str_finish(pStr); +} +#endif /* SQLITE_ENABLE_NORMALIZE */ diff --git a/src/treeview.c b/src/treeview.c index 16fe5c2..743c3b1 100644 --- a/src/treeview.c +++ b/src/treeview.c @@ -138,7 +138,8 @@ void sqlite3TreeViewSrcList(TreeView *pView, const SrcList *pSrc){ sqlite3_str_appendf(&x, " %s", pItem->zName); } if( pItem->pTab ){ - sqlite3_str_appendf(&x, " tabname=%Q", pItem->pTab->zName); + sqlite3_str_appendf(&x, " tab=%Q nCol=%d ptr=%p", + pItem->pTab->zName, pItem->pTab->nCol, pItem->pTab); } if( pItem->zAlias ){ sqlite3_str_appendf(&x, " (AS %s)", pItem->zAlias); diff --git a/src/trigger.c b/src/trigger.c index dd6224d..c37f76d 100644 --- a/src/trigger.c +++ b/src/trigger.c @@ -731,7 +731,7 @@ static SrcList *targetSrcList( int iDb; /* Index of the database to use */ SrcList *pSrc; /* SrcList to be returned */ - pSrc = sqlite3SrcListAppend(db, 0, 0, 0); + pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( pSrc ){ assert( pSrc->nSrc>0 ); pSrc->a[pSrc->nSrc-1].zName = sqlite3DbStrDup(db, pStep->zTarget); @@ -916,6 +916,7 @@ static TriggerPrg *codeRowTrigger( pSubParse->zAuthContext = pTrigger->zName; pSubParse->eTriggerOp = pTrigger->op; pSubParse->nQueryLoop = pParse->nQueryLoop; + pSubParse->disableVtab = pParse->disableVtab; v = sqlite3GetVdbe(pSubParse); if( v ){ @@ -943,7 +944,7 @@ static TriggerPrg *codeRowTrigger( if( SQLITE_OK==sqlite3ResolveExprNames(&sNC, pWhen) && db->mallocFailed==0 ){ - iEndTrigger = sqlite3VdbeMakeLabel(v); + iEndTrigger = sqlite3VdbeMakeLabel(pSubParse); sqlite3ExprIfFalse(pSubParse, pWhen, iEndTrigger, SQLITE_JUMPIFNULL); } sqlite3ExprDelete(db, pWhen); diff --git a/src/update.c b/src/update.c index 70f4f67..132837d 100644 --- a/src/update.c +++ b/src/update.c @@ -354,6 +354,7 @@ void sqlite3Update( ** being updated. Fill in aRegIdx[] with a register number that will hold ** the key for accessing each index. */ + if( onError==OE_Replace ) bReplace = 1; for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){ int reg; if( chngKey || hasFK>1 || pIdx==pPk @@ -367,9 +368,7 @@ void sqlite3Update( if( indexColumnIsBeingUpdated(pIdx, i, aXRef, chngRowid) ){ reg = ++pParse->nMem; pParse->nMem += pIdx->nColumn; - if( (onError==OE_Replace) - || (onError==OE_Default && pIdx->onError==OE_Replace) - ){ + if( onError==OE_Default && pIdx->onError==OE_Replace ){ bReplace = 1; } break; @@ -441,7 +440,7 @@ void sqlite3Update( #endif /* Jump to labelBreak to abandon further processing of this UPDATE */ - labelContinue = labelBreak = sqlite3VdbeMakeLabel(v); + labelContinue = labelBreak = sqlite3VdbeMakeLabel(pParse); /* Not an UPSERT. Normal processing. Begin by ** initialize the count of updated rows */ @@ -576,13 +575,13 @@ void sqlite3Update( VdbeCoverage(v); } if( eOnePass!=ONEPASS_SINGLE ){ - labelContinue = sqlite3VdbeMakeLabel(v); + labelContinue = sqlite3VdbeMakeLabel(pParse); } sqlite3VdbeAddOp2(v, OP_IsNull, pPk ? regKey : regOldRowid, labelBreak); VdbeCoverageIf(v, pPk==0); VdbeCoverageIf(v, pPk!=0); }else if( pPk ){ - labelContinue = sqlite3VdbeMakeLabel(v); + labelContinue = sqlite3VdbeMakeLabel(pParse); sqlite3VdbeAddOp2(v, OP_Rewind, iEph, labelBreak); VdbeCoverage(v); addrTop = sqlite3VdbeAddOp2(v, OP_RowData, iEph, regKey); sqlite3VdbeAddOp4Int(v, OP_NotFound, iDataCur, labelContinue, regKey, 0); diff --git a/src/util.c b/src/util.c index 54f9b93..8432d89 100644 --- a/src/util.c +++ b/src/util.c @@ -238,7 +238,7 @@ void sqlite3ErrorMsg(Parse *pParse, const char *zFormat, ...){ ** dequoted string, exclusive of the zero terminator, if dequoting does ** occur. ** -** 2002-Feb-14: This routine is extended to remove MS-Access style +** 2002-02-14: This routine is extended to remove MS-Access style ** brackets from around identifiers. For example: "[a-b-c]" becomes ** "a-b-c". */ @@ -264,6 +264,11 @@ void sqlite3Dequote(char *z){ } z[j] = 0; } +void sqlite3DequoteExpr(Expr *p){ + assert( sqlite3Isquote(p->u.zToken[0]) ); + p->flags |= p->u.zToken[0]=='"' ? EP_Quoted|EP_DblQuoted : EP_Quoted; + sqlite3Dequote(p->u.zToken); +} /* ** Generate a Token object from a string diff --git a/src/vacuum.c b/src/vacuum.c index 5fb0489..8042f10 100644 --- a/src/vacuum.c +++ b/src/vacuum.c @@ -102,16 +102,16 @@ static int execSqlF(sqlite3 *db, char **pzErrMsg, const char *zSql, ...){ ** transient would cause the database file to appear to be deleted ** following reboot. */ -void sqlite3Vacuum(Parse *pParse, Token *pNm){ +void sqlite3Vacuum(Parse *pParse, Token *pNm, Expr *pInto){ Vdbe *v = sqlite3GetVdbe(pParse); int iDb = 0; - if( v==0 ) return; + if( v==0 ) goto build_vacuum_end; if( pNm ){ #ifndef SQLITE_BUG_COMPATIBLE_20160819 /* Default behavior: Report an error if the argument to VACUUM is ** not recognized */ iDb = sqlite3TwoPartName(pParse, pNm, pNm, &pNm); - if( iDb<0 ) return; + if( iDb<0 ) goto build_vacuum_end; #else /* When SQLITE_BUG_COMPATIBLE_20160819 is defined, unrecognized arguments ** to VACUUM are silently ignored. This is a back-out of a bug fix that @@ -123,21 +123,33 @@ void sqlite3Vacuum(Parse *pParse, Token *pNm){ #endif } if( iDb!=1 ){ - sqlite3VdbeAddOp1(v, OP_Vacuum, iDb); + int iIntoReg = 0; + if( pInto && sqlite3ResolveSelfReference(pParse,0,0,pInto,0)==0 ){ + iIntoReg = ++pParse->nMem; + sqlite3ExprCode(pParse, pInto, iIntoReg); + } + sqlite3VdbeAddOp2(v, OP_Vacuum, iDb, iIntoReg); sqlite3VdbeUsesBtree(v, iDb); } +build_vacuum_end: + sqlite3ExprDelete(pParse->db, pInto); return; } /* ** This routine implements the OP_Vacuum opcode of the VDBE. */ -int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ +int sqlite3RunVacuum( + char **pzErrMsg, /* Write error message here */ + sqlite3 *db, /* Database connection */ + int iDb, /* Which attached DB to vacuum */ + sqlite3_value *pOut /* Write results here, if not NULL */ +){ int rc = SQLITE_OK; /* Return code from service routines */ Btree *pMain; /* The database being vacuumed */ Btree *pTemp; /* The temporary database we vacuum into */ - u16 saved_mDbFlags; /* Saved value of db->mDbFlags */ - u32 saved_flags; /* Saved value of db->flags */ + u32 saved_mDbFlags; /* Saved value of db->mDbFlags */ + u64 saved_flags; /* Saved value of db->flags */ int saved_nChange; /* Saved value of db->nChange */ int saved_nTotalChange; /* Saved value of db->nTotalChange */ u8 saved_mTrace; /* Saved trace settings */ @@ -146,6 +158,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ int nRes; /* Bytes of reserved space at the end of each page */ int nDb; /* Number of attached databases */ const char *zDbMain; /* Schema name of database to vacuum */ + const char *zOut; /* Name of output file */ if( !db->autoCommit ){ sqlite3SetString(pzErrMsg, db, "cannot VACUUM from within a transaction"); @@ -155,6 +168,15 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ sqlite3SetString(pzErrMsg, db,"cannot VACUUM - SQL statements in progress"); return SQLITE_ERROR; } + if( pOut ){ + if( sqlite3_value_type(pOut)!=SQLITE_TEXT ){ + sqlite3SetString(pzErrMsg, db, "non-text filename"); + return SQLITE_ERROR; + } + zOut = (const char*)sqlite3_value_text(pOut); + }else{ + zOut = ""; + } /* Save the current value of the database flags so that it can be ** restored before returning. Then set the writable-schema flag, and @@ -166,7 +188,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ saved_mTrace = db->mTrace; db->flags |= SQLITE_WriteSchema | SQLITE_IgnoreChecks; db->mDbFlags |= DBFLAG_PreferBuiltin | DBFLAG_Vacuum; - db->flags &= ~(SQLITE_ForeignKeys | SQLITE_ReverseOrder + db->flags &= ~(u64)(SQLITE_ForeignKeys | SQLITE_ReverseOrder | SQLITE_Defensive | SQLITE_CountRows); db->mTrace = 0; @@ -189,19 +211,21 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ ** to write the journal header file. */ nDb = db->nDb; - rc = execSql(db, pzErrMsg, "ATTACH''AS vacuum_db"); + rc = execSqlF(db, pzErrMsg, "ATTACH %Q AS vacuum_db", zOut); if( rc!=SQLITE_OK ) goto end_of_vacuum; assert( (db->nDb-1)==nDb ); pDb = &db->aDb[nDb]; assert( strcmp(pDb->zDbSName,"vacuum_db")==0 ); pTemp = pDb->pBt; - - /* The call to execSql() to attach the temp database has left the file - ** locked (as there was more than one active statement when the transaction - ** to read the schema was concluded. Unlock it here so that this doesn't - ** cause problems for the call to BtreeSetPageSize() below. */ - sqlite3BtreeCommit(pTemp); - + if( pOut ){ + sqlite3_file *id = sqlite3PagerFile(sqlite3BtreePager(pTemp)); + i64 sz = 0; + if( id->pMethods!=0 && (sqlite3OsFileSize(id, &sz)!=SQLITE_OK || sz>0) ){ + rc = SQLITE_ERROR; + sqlite3SetString(pzErrMsg, db, "output file already exists"); + goto end_of_vacuum; + } + } nRes = sqlite3BtreeGetOptimalReserve(pMain); /* A VACUUM cannot change the pagesize of an encrypted database. */ @@ -225,7 +249,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ */ rc = execSql(db, pzErrMsg, "BEGIN"); if( rc!=SQLITE_OK ) goto end_of_vacuum; - rc = sqlite3BtreeBeginTrans(pMain, 2, 0); + rc = sqlite3BtreeBeginTrans(pMain, pOut==0 ? 2 : 0, 0); if( rc!=SQLITE_OK ) goto end_of_vacuum; /* Do not attempt to change the page size for a WAL database */ @@ -320,7 +344,7 @@ int sqlite3RunVacuum(char **pzErrMsg, sqlite3 *db, int iDb){ }; assert( 1==sqlite3BtreeIsInTrans(pTemp) ); - assert( 1==sqlite3BtreeIsInTrans(pMain) ); + assert( pOut!=0 || 1==sqlite3BtreeIsInTrans(pMain) ); /* Copy Btree meta values */ for(i=0; iflags */ diff --git a/src/vdbe.c b/src/vdbe.c index 14f3e1b..98df0a3 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -240,6 +240,11 @@ static VdbeCursor *allocateCursor( assert( iCur>=0 && iCurnCursor ); if( p->apCsr[iCur] ){ /*OPTIMIZATION-IF-FALSE*/ + /* Before calling sqlite3VdbeFreeCursor(), ensure the isEphemeral flag + ** is clear. Otherwise, if this is an ephemeral cursor created by + ** OP_OpenDup, the cursor will not be closed and will still be part + ** of a BtShared.pCursor list. */ + p->apCsr[iCur]->isEphemeral = 0; sqlite3VdbeFreeCursor(p, p->apCsr[iCur]); p->apCsr[iCur] = 0; } @@ -380,6 +385,7 @@ void sqlite3ValueApplyAffinity( 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; } @@ -1578,8 +1584,8 @@ fp_math: break; } default: { - iA = (i64)rA; - iB = (i64)rB; + iA = sqlite3VdbeIntValue(pIn1); + iB = sqlite3VdbeIntValue(pIn2); if( iA==0 ) goto arithmetic_result_is_null; if( iA==-1 ) iA = 1; rB = (double)(iB % iA); @@ -1925,7 +1931,8 @@ case OP_Ge: { /* same as TK_GE, jump, in1, in3 */ */ assert( pOp->opcode==OP_Eq || pOp->opcode==OP_Ne ); assert( (flags1 & MEM_Cleared)==0 ); - assert( (pOp->p5 & SQLITE_JUMPIFNULL)==0 ); + assert( (pOp->p5 & SQLITE_JUMPIFNULL)==0 || CORRUPT_DB ); + testcase( (pOp->p5 & SQLITE_JUMPIFNULL)!=0 ); if( (flags1&flags3&MEM_Null)!=0 && (flags3&MEM_Cleared)==0 ){ @@ -3609,7 +3616,8 @@ case OP_OpenDup: { pCx->isEphemeral = 1; pCx->pKeyInfo = pOrig->pKeyInfo; pCx->isTable = pOrig->isTable; - rc = sqlite3BtreeCursor(pOrig->pBtx, MASTER_ROOT, BTREE_WRCSR, + pCx->pgnoRoot = pOrig->pgnoRoot; + rc = sqlite3BtreeCursor(pOrig->pBtx, pCx->pgnoRoot, BTREE_WRCSR, pCx->pKeyInfo, pCx->uc.pCursor); /* The sqlite3BtreeCursor() routine can only fail for the first cursor ** opened for a database. Since there is already an open cursor when this @@ -3627,6 +3635,9 @@ case OP_OpenDup: { ** the main database is read-only. The ephemeral ** table is deleted automatically when the cursor is closed. ** +** If the cursor P1 is already opened on an ephemeral table, the table +** is cleared (all content is erased). +** ** P2 is the number of columns in the ephemeral table. ** The cursor points to a BTree table if P4==0 and to a BTree index ** if P4 is not 0. If P4 is not NULL, it points to a KeyInfo structure @@ -3658,41 +3669,50 @@ case OP_OpenEphemeral: { SQLITE_OPEN_TRANSIENT_DB; assert( pOp->p1>=0 ); assert( pOp->p2>=0 ); - pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); - if( pCx==0 ) goto no_mem; - pCx->nullRow = 1; - pCx->isEphemeral = 1; - rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, - BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, vfsFlags); - if( rc==SQLITE_OK ){ - rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0); - } - if( rc==SQLITE_OK ){ - /* If a transient index is required, create it by calling - ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before - ** opening it. If a transient table is required, just use the - ** automatically created table with root-page 1 (an BLOB_INTKEY table). - */ - if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ - int pgno; - assert( pOp->p4type==P4_KEYINFO ); - rc = sqlite3BtreeCreateTable(pCx->pBtx, &pgno, BTREE_BLOBKEY | pOp->p5); - if( rc==SQLITE_OK ){ - assert( pgno==MASTER_ROOT+1 ); - assert( pKeyInfo->db==db ); - assert( pKeyInfo->enc==ENC(db) ); - rc = sqlite3BtreeCursor(pCx->pBtx, pgno, BTREE_WRCSR, - pKeyInfo, pCx->uc.pCursor); - } - pCx->isTable = 0; - }else{ - rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR, - 0, pCx->uc.pCursor); - pCx->isTable = 1; + pCx = p->apCsr[pOp->p1]; + if( pCx ){ + /* If the ephermeral table is already open, erase all existing content + ** so that the table is empty again, rather than creating a new table. */ + rc = sqlite3BtreeClearTable(pCx->pBtx, pCx->pgnoRoot, 0); + }else{ + pCx = allocateCursor(p, pOp->p1, pOp->p2, -1, CURTYPE_BTREE); + if( pCx==0 ) goto no_mem; + pCx->nullRow = 1; + pCx->isEphemeral = 1; + rc = sqlite3BtreeOpen(db->pVfs, 0, db, &pCx->pBtx, + BTREE_OMIT_JOURNAL | BTREE_SINGLE | pOp->p5, + vfsFlags); + if( rc==SQLITE_OK ){ + rc = sqlite3BtreeBeginTrans(pCx->pBtx, 1, 0); } + if( rc==SQLITE_OK ){ + /* If a transient index is required, create it by calling + ** sqlite3BtreeCreateTable() with the BTREE_BLOBKEY flag before + ** opening it. If a transient table is required, just use the + ** automatically created table with root-page 1 (an BLOB_INTKEY table). + */ + if( (pCx->pKeyInfo = pKeyInfo = pOp->p4.pKeyInfo)!=0 ){ + assert( pOp->p4type==P4_KEYINFO ); + rc = sqlite3BtreeCreateTable(pCx->pBtx, (int*)&pCx->pgnoRoot, + BTREE_BLOBKEY | pOp->p5); + if( rc==SQLITE_OK ){ + assert( pCx->pgnoRoot==MASTER_ROOT+1 ); + assert( pKeyInfo->db==db ); + assert( pKeyInfo->enc==ENC(db) ); + rc = sqlite3BtreeCursor(pCx->pBtx, pCx->pgnoRoot, BTREE_WRCSR, + pKeyInfo, pCx->uc.pCursor); + } + pCx->isTable = 0; + }else{ + pCx->pgnoRoot = MASTER_ROOT; + rc = sqlite3BtreeCursor(pCx->pBtx, MASTER_ROOT, BTREE_WRCSR, + 0, pCx->uc.pCursor); + pCx->isTable = 1; + } + } + pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); } if( rc ) goto abort_due_to_error; - pCx->isOrdered = (pOp->p5!=BTREE_UNORDERED); break; } @@ -4342,7 +4362,7 @@ case OP_NotExists: /* jump, in3 */ pC = p->apCsr[pOp->p1]; assert( pC!=0 ); #ifdef SQLITE_DEBUG - pC->seekOp = OP_SeekRowid; + if( pOp->opcode==OP_SeekRowid ) pC->seekOp = OP_SeekRowid; #endif assert( pC->isTable ); assert( pC->eCurType==CURTYPE_BTREE ); @@ -5250,7 +5270,7 @@ case OP_Next: /* jump */ assert( pOp->opcode!=OP_Next || pC->seekOp==OP_SeekGT || pC->seekOp==OP_SeekGE || pC->seekOp==OP_Rewind || pC->seekOp==OP_Found - || pC->seekOp==OP_NullRow); + || pC->seekOp==OP_NullRow|| pC->seekOp==OP_SeekRowid); assert( pOp->opcode!=OP_Prev || pC->seekOp==OP_SeekLT || pC->seekOp==OP_SeekLE || pC->seekOp==OP_Last @@ -5780,9 +5800,16 @@ case OP_ParseSchema: { assert( db->init.busy==0 ); db->init.busy = 1; initData.rc = SQLITE_OK; + initData.nInitRow = 0; assert( !db->mallocFailed ); rc = sqlite3_exec(db, zSql, sqlite3InitCallback, &initData, 0); if( rc==SQLITE_OK ) rc = initData.rc; + if( rc==SQLITE_OK && initData.nInitRow==0 ){ + /* The OP_ParseSchema opcode with a non-NULL P4 argument should parse + ** at least one SQL statement. Any less than that indicates that + ** the sqlite_master table is corrupt. */ + rc = SQLITE_CORRUPT_BKPT; + } sqlite3DbFreeNN(db, zSql); db->init.busy = 0; } @@ -6145,6 +6172,17 @@ case OP_Program: { /* jump */ p->nOp = pProgram->nOp; #ifdef SQLITE_ENABLE_STMT_SCANSTATUS p->anExec = 0; +#endif +#ifdef SQLITE_DEBUG + /* Verify that second and subsequent executions of the same trigger do not + ** try to reuse register values from the first use. */ + { + int i; + for(i=0; inMem; i++){ + aMem[i].pScopyFrom = 0; /* Prevent false-positive AboutToChange() errs */ + aMem[i].flags |= MEM_Undefined; /* Cause a fault if this reg is reused */ + } + } #endif pOp = &aOp[-1]; @@ -6684,14 +6722,19 @@ case OP_JournalMode: { /* out2 */ #endif /* SQLITE_OMIT_PRAGMA */ #if !defined(SQLITE_OMIT_VACUUM) && !defined(SQLITE_OMIT_ATTACH) -/* Opcode: Vacuum P1 * * * * +/* Opcode: Vacuum P1 P2 * * * ** ** Vacuum the entire database P1. P1 is 0 for "main", and 2 or more ** for an attached database. The "temp" database may not be vacuumed. +** +** If P2 is not zero, then it is a register holding a string which is +** the file into which the result of vacuum should be written. When +** P2 is zero, the vacuum overwrites the original database. */ case OP_Vacuum: { assert( p->readOnly==0 ); - rc = sqlite3RunVacuum(&p->zErrMsg, db, pOp->p1); + rc = sqlite3RunVacuum(&p->zErrMsg, db, pOp->p1, + pOp->p2 ? &aMem[pOp->p2] : 0); if( rc ) goto abort_due_to_error; break; } @@ -6843,6 +6886,7 @@ case OP_VDestroy: { db->nVDestroy++; rc = sqlite3VtabCallDestroy(db, pOp->p1, pOp->p4.z); db->nVDestroy--; + assert( p->errorAction==OE_Abort && p->usesStmtJournal ); if( rc ) goto abort_due_to_error; break; } @@ -7086,7 +7130,7 @@ case OP_VRename: { rc = sqlite3VdbeChangeEncoding(pName, SQLITE_UTF8); if( rc ) goto abort_due_to_error; rc = pVtab->pModule->xRename(pVtab, pName->z); - if( isLegacy==0 ) db->flags &= ~SQLITE_LegacyAlter; + if( isLegacy==0 ) db->flags &= ~(u64)SQLITE_LegacyAlter; sqlite3VtabImportErrmsg(p, pVtab); p->expired = 0; if( rc ) goto abort_due_to_error; diff --git a/src/vdbe.h b/src/vdbe.h index d42acc0..041a91c 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -156,12 +156,11 @@ typedef struct VdbeOpList VdbeOpList; #endif /* -** The following macro converts a relative address in the p2 field -** of a VdbeOp structure into a negative number so that -** sqlite3VdbeAddOpList() knows that the address is relative. Calling -** the macro again restores the address. +** The following macro converts a label returned by sqlite3VdbeMakeLabel() +** into an index into the Parse.aLabel[] array that contains the resolved +** address of that label. */ -#define ADDR(X) (-1-(X)) +#define ADDR(X) (~(X)) /* ** The makefile scans the vdbe.c source file and creates the "opcodes.h" @@ -215,6 +214,12 @@ VdbeOp *sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp,int iLineno); # define ExplainQueryPlan(P) # define ExplainQueryPlanPop(P) # define ExplainQueryPlanParent(P) 0 +# define sqlite3ExplainBreakpoint(A,B) /*no-op*/ +#endif +#if defined(SQLITE_DEBUG) && !defined(SQLITE_OMIT_EXPLAIN) + void sqlite3ExplainBreakpoint(const char*,const char*); +#else +# define sqlite3ExplainBreakpoint(A,B) /*no-op*/ #endif void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*); void sqlite3VdbeChangeOpcode(Vdbe*, u32 addr, u8); @@ -230,7 +235,7 @@ void sqlite3VdbeAppendP4(Vdbe*, void *pP4, int p4type); void sqlite3VdbeSetP4KeyInfo(Parse*, Index*); void sqlite3VdbeUsesBtree(Vdbe*, int); VdbeOp *sqlite3VdbeGetOp(Vdbe*, int); -int sqlite3VdbeMakeLabel(Vdbe*); +int sqlite3VdbeMakeLabel(Parse*); void sqlite3VdbeRunOnlyOnce(Vdbe*); void sqlite3VdbeReusable(Vdbe*); void sqlite3VdbeDelete(Vdbe*); @@ -251,6 +256,10 @@ void sqlite3VdbeCountChanges(Vdbe*); sqlite3 *sqlite3VdbeDb(Vdbe*); u8 sqlite3VdbePrepareFlags(Vdbe*); void sqlite3VdbeSetSql(Vdbe*, const char *z, int n, u8); +#ifdef SQLITE_ENABLE_NORMALIZE +void sqlite3VdbeAddDblquoteStr(sqlite3*,Vdbe*,const char*); +int sqlite3VdbeUsesDoubleQuotedString(Vdbe*,const char*); +#endif void sqlite3VdbeSwap(Vdbe*,Vdbe*); VdbeOp *sqlite3VdbeTakeOpArray(Vdbe*, int*, int*); sqlite3_value *sqlite3VdbeGetBoundValue(Vdbe*, int, u8); diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 5c71992..acc7f5a 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -335,6 +335,9 @@ struct sqlite3_context { */ typedef unsigned bft; /* Bit Field Type */ +/* The ScanStatus object holds a single value for the +** sqlite3_stmt_scanstatus() interface. +*/ typedef struct ScanStatus ScanStatus; struct ScanStatus { int addrExplain; /* OP_Explain for loop */ @@ -345,6 +348,19 @@ struct ScanStatus { char *zName; /* Name of table or index */ }; +/* The DblquoteStr object holds the text of a double-quoted +** string for a prepared statement. A linked list of these objects +** is constructed during statement parsing and is held on Vdbe.pDblStr. +** When computing a normalized SQL statement for an SQL statement, that +** list is consulted for each double-quoted identifier to see if the +** identifier should really be a string literal. +*/ +typedef struct DblquoteStr DblquoteStr; +struct DblquoteStr { + DblquoteStr *pNextStr; /* Next string literal in the list */ + char z[8]; /* Dequoted value for the string */ +}; + /* ** An instance of the virtual machine. This structure contains the complete ** state of the virtual machine. @@ -364,28 +380,29 @@ struct Vdbe { int pc; /* The program counter */ int rc; /* Value to return */ int nChange; /* Number of db changes made since last reset */ - int iStatement; /* Statement number (or 0 if has not opened stmt) */ + int iStatement; /* Statement number (or 0 if has no opened stmt) */ i64 iCurrentTime; /* Value of julianday('now') for this statement */ i64 nFkConstraint; /* Number of imm. FK constraints this VM */ i64 nStmtDefCons; /* Number of def. constraints when stmt started */ i64 nStmtDefImmCons; /* Number of def. imm constraints when stmt started */ + Mem *aMem; /* The memory locations */ + Mem **apArg; /* Arguments to currently executing user function */ + VdbeCursor **apCsr; /* One element of this array for each open cursor */ + Mem *aVar; /* Values for the OP_Variable opcode. */ /* When allocating a new Vdbe object, all of the fields below should be ** initialized to zero or NULL */ Op *aOp; /* Space to hold the virtual machine's program */ - Mem *aMem; /* The memory locations */ - Mem **apArg; /* Arguments to currently executing user function */ + int nOp; /* Number of instructions in the program */ + int nOpAlloc; /* Slots allocated for aOp[] */ Mem *aColName; /* Column names to return */ Mem *pResultSet; /* Pointer to an array of results */ char *zErrMsg; /* Error message written here */ - VdbeCursor **apCsr; /* One element of this array for each open cursor */ - Mem *aVar; /* Values for the OP_Variable opcode. */ VList *pVList; /* Name of variables */ #ifndef SQLITE_OMIT_TRACE i64 startTime; /* Time when query started - used for profiling */ #endif - int nOp; /* Number of instructions in the program */ #ifdef SQLITE_DEBUG int rcApp; /* errcode set by sqlite3_result_error_code() */ u32 nWrite; /* Number of write operations that have occurred */ @@ -408,6 +425,7 @@ struct Vdbe { char *zSql; /* Text of the SQL statement that generated this */ #ifdef SQLITE_ENABLE_NORMALIZE char *zNormSql; /* Normalization of the associated SQL statement */ + DblquoteStr *pDblStr; /* List of double-quoted string literals */ #endif void *pFree; /* Free this when deleting the vdbe */ VdbeFrame *pFrame; /* Parent frame */ diff --git a/src/vdbeapi.c b/src/vdbeapi.c index 59327be..23b1927 100644 --- a/src/vdbeapi.c +++ b/src/vdbeapi.c @@ -62,14 +62,16 @@ static SQLITE_NOINLINE void invokeProfileCallback(sqlite3 *db, Vdbe *p){ sqlite3_int64 iNow; sqlite3_int64 iElapse; assert( p->startTime>0 ); - assert( db->xProfile!=0 || (db->mTrace & SQLITE_TRACE_PROFILE)!=0 ); + assert( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 ); assert( db->init.busy==0 ); assert( p->zSql!=0 ); sqlite3OsCurrentTimeInt64(db->pVfs, &iNow); iElapse = (iNow - p->startTime)*1000000; +#ifndef SQLITE_OMIT_DEPRECATED if( db->xProfile ){ db->xProfile(db->pProfileArg, p->zSql, iElapse); } +#endif if( db->mTrace & SQLITE_TRACE_PROFILE ){ db->xTrace(SQLITE_TRACE_PROFILE, db->pTraceArg, p, (void*)&iElapse); } @@ -583,7 +585,7 @@ static int sqlite3Step(Vdbe *p){ return SQLITE_NOMEM_BKPT; } - if( p->pc<=0 && p->expired ){ + if( p->pc<0 && p->expired ){ p->rc = SQLITE_SCHEMA; rc = SQLITE_ERROR; goto end_of_step; @@ -602,7 +604,7 @@ static int sqlite3Step(Vdbe *p){ ); #ifndef SQLITE_OMIT_TRACE - if( (db->xProfile || (db->mTrace & SQLITE_TRACE_PROFILE)!=0) + if( (db->mTrace & (SQLITE_TRACE_PROFILE|SQLITE_TRACE_XPROFILE))!=0 && !db->init.busy && p->zSql ){ sqlite3OsCurrentTimeInt64(db->pVfs, &p->startTime); }else{ @@ -629,16 +631,18 @@ static int sqlite3Step(Vdbe *p){ db->nVdbeExec--; } + if( rc!=SQLITE_ROW ){ #ifndef SQLITE_OMIT_TRACE - /* If the statement completed successfully, invoke the profile callback */ - if( rc!=SQLITE_ROW ) checkProfileCallback(db, p); + /* If the statement completed successfully, invoke the profile callback */ + checkProfileCallback(db, p); #endif - if( rc==SQLITE_DONE && db->autoCommit ){ - assert( p->rc==SQLITE_OK ); - p->rc = doWalCallbacks(db); - if( p->rc!=SQLITE_OK ){ - rc = SQLITE_ERROR; + if( rc==SQLITE_DONE && db->autoCommit ){ + assert( p->rc==SQLITE_OK ); + p->rc = doWalCallbacks(db); + if( p->rc!=SQLITE_OK ){ + rc = SQLITE_ERROR; + } } } @@ -658,9 +662,9 @@ end_of_step: || (rc&0xff)==SQLITE_BUSY || rc==SQLITE_MISUSE ); assert( (p->rc!=SQLITE_ROW && p->rc!=SQLITE_DONE) || p->rc==p->rcApp ); - if( (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 - && rc!=SQLITE_ROW - && rc!=SQLITE_DONE + if( rc!=SQLITE_ROW + && rc!=SQLITE_DONE + && (p->prepFlags & SQLITE_PREPARE_SAVESQL)!=0 ){ /* If this statement was prepared using saved SQL and an ** error has occurred, then return the error code in p->rc to the @@ -1282,7 +1286,7 @@ static int vdbeUnbind(Vdbe *p, int i){ pVar = &p->aVar[i]; sqlite3VdbeMemRelease(pVar); pVar->flags = MEM_Null; - sqlite3Error(p->db, SQLITE_OK); + p->db->errCode = SQLITE_OK; /* If the bit corresponding to this variable in Vdbe.expmask is set, then ** binding a new value to this variable invalidates the current query plan. @@ -1708,7 +1712,13 @@ char *sqlite3_expanded_sql(sqlite3_stmt *pStmt){ */ const char *sqlite3_normalized_sql(sqlite3_stmt *pStmt){ Vdbe *p = (Vdbe *)pStmt; - return p ? p->zNormSql : 0; + if( p==0 ) return 0; + if( p->zNormSql==0 && ALWAYS(p->zSql!=0) ){ + sqlite3_mutex_enter(p->db->mutex); + p->zNormSql = sqlite3Normalize(p, p->zSql); + sqlite3_mutex_leave(p->db->mutex); + } + return p->zNormSql; } #endif /* SQLITE_ENABLE_NORMALIZE */ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index f1496a3..aba7550 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -36,7 +36,7 @@ Vdbe *sqlite3VdbeCreate(Parse *pParse){ pParse->pVdbe = p; assert( pParse->aLabel==0 ); assert( pParse->nLabel==0 ); - assert( pParse->nOpAlloc==0 ); + assert( p->nOpAlloc==0 ); assert( pParse->szOpAlloc==0 ); sqlite3VdbeAddOp2(p, OP_Init, 0, 1); return p; @@ -64,15 +64,45 @@ void sqlite3VdbeSetSql(Vdbe *p, const char *z, int n, u8 prepFlags){ } assert( p->zSql==0 ); p->zSql = sqlite3DbStrNDup(p->db, z, n); -#ifdef SQLITE_ENABLE_NORMALIZE - assert( p->zNormSql==0 ); - if( p->zSql && (prepFlags & SQLITE_PREPARE_NORMALIZE)!=0 ){ - sqlite3Normalize(p, p->zSql, n, prepFlags); - assert( p->zNormSql!=0 || p->db->mallocFailed ); - } -#endif } +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** Add a new element to the Vdbe->pDblStr list. +*/ +void sqlite3VdbeAddDblquoteStr(sqlite3 *db, Vdbe *p, const char *z){ + if( p ){ + int n = sqlite3Strlen30(z); + DblquoteStr *pStr = sqlite3DbMallocRawNN(db, + sizeof(*pStr)+n+1-sizeof(pStr->z)); + if( pStr ){ + pStr->pNextStr = p->pDblStr; + p->pDblStr = pStr; + memcpy(pStr->z, z, n+1); + } + } +} +#endif + +#ifdef SQLITE_ENABLE_NORMALIZE +/* +** zId of length nId is a double-quoted identifier. Check to see if +** that identifier is really used as a string literal. +*/ +int sqlite3VdbeUsesDoubleQuotedString( + Vdbe *pVdbe, /* The prepared statement */ + const char *zId /* The double-quoted identifier, already dequoted */ +){ + DblquoteStr *pStr; + assert( zId!=0 ); + if( pVdbe->pDblStr==0 ) return 0; + for(pStr=pVdbe->pDblStr; pStr; pStr=pStr->pNextStr){ + if( strcmp(zId, pStr->z)==0 ) return 1; + } + return 0; +} +#endif + /* ** Swap all content between two VDBE structures. */ @@ -92,7 +122,7 @@ void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ zTmp = pA->zSql; pA->zSql = pB->zSql; pB->zSql = zTmp; -#ifdef SQLITE_ENABLE_NORMALIZE +#if 0 zTmp = pA->zNormSql; pA->zNormSql = pB->zNormSql; pB->zNormSql = zTmp; @@ -109,7 +139,7 @@ void sqlite3VdbeSwap(Vdbe *pA, Vdbe *pB){ ** to 1024/sizeof(Op). ** ** If an out-of-memory error occurs while resizing the array, return -** SQLITE_NOMEM. In this case Vdbe.aOp and Parse.nOpAlloc remain +** SQLITE_NOMEM. In this case Vdbe.aOp and Vdbe.nOpAlloc remain ** unchanged (this is so that any opcodes already allocated can be ** correctly deallocated along with the rest of the Vdbe). */ @@ -125,9 +155,9 @@ static int growOpArray(Vdbe *v, int nOp){ ** operation (without SQLITE_TEST_REALLOC_STRESS) is to double the current ** size of the op array or add 1KB of space, whichever is smaller. */ #ifdef SQLITE_TEST_REALLOC_STRESS - int nNew = (p->nOpAlloc>=512 ? p->nOpAlloc*2 : p->nOpAlloc+nOp); + int nNew = (v->nOpAlloc>=512 ? v->nOpAlloc*2 : v->nOpAlloc+nOp); #else - int nNew = (p->nOpAlloc ? p->nOpAlloc*2 : (int)(1024/sizeof(Op))); + int nNew = (v->nOpAlloc ? v->nOpAlloc*2 : (int)(1024/sizeof(Op))); UNUSED_PARAMETER(nOp); #endif @@ -138,11 +168,11 @@ static int growOpArray(Vdbe *v, int nOp){ } assert( nOp<=(1024/sizeof(Op)) ); - assert( nNew>=(p->nOpAlloc+nOp) ); + assert( nNew>=(v->nOpAlloc+nOp) ); pNew = sqlite3DbRealloc(p->db, v->aOp, nNew*sizeof(Op)); if( pNew ){ p->szOpAlloc = sqlite3DbMallocSize(p->db, pNew); - p->nOpAlloc = p->szOpAlloc/sizeof(Op); + v->nOpAlloc = p->szOpAlloc/sizeof(Op); v->aOp = pNew; } return (pNew ? SQLITE_OK : SQLITE_NOMEM_BKPT); @@ -176,9 +206,9 @@ static void test_addop_breakpoint(void){ ** operand. */ static SQLITE_NOINLINE int growOp3(Vdbe *p, int op, int p1, int p2, int p3){ - assert( p->pParse->nOpAlloc<=p->nOp ); + assert( p->nOpAlloc<=p->nOp ); if( growOpArray(p, 1) ) return 1; - assert( p->pParse->nOpAlloc>p->nOp ); + assert( p->nOpAlloc>p->nOp ); return sqlite3VdbeAddOp3(p, op, p1, p2, p3); } int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ @@ -188,7 +218,7 @@ int sqlite3VdbeAddOp3(Vdbe *p, int op, int p1, int p2, int p3){ i = p->nOp; assert( p->magic==VDBE_MAGIC_INIT ); assert( op>=0 && op<0xff ); - if( p->pParse->nOpAlloc<=i ){ + if( p->nOpAlloc<=i ){ return growOp3(p, op, p1, p2, p3); } p->nOp++; @@ -320,13 +350,29 @@ int sqlite3VdbeExplainParent(Parse *pParse){ } /* -** Add a new OP_Explain opcode. +** Set a debugger breakpoint on the following routine in order to +** monitor the EXPLAIN QUERY PLAN code generation. +*/ +#if defined(SQLITE_DEBUG) +void sqlite3ExplainBreakpoint(const char *z1, const char *z2){ + (void)z1; + (void)z2; +} +#endif + +/* +** Add a new OP_ opcode. ** ** If the bPush flag is true, then make this opcode the parent for ** subsequent Explains until sqlite3VdbeExplainPop() is called. */ void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ - if( pParse->explain==2 ){ +#ifndef SQLITE_DEBUG + /* Always include the OP_Explain opcodes if SQLITE_DEBUG is defined. + ** But omit them (for performance) during production builds */ + if( pParse->explain==2 ) +#endif + { char *zMsg; Vdbe *v; va_list ap; @@ -338,7 +384,10 @@ void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ iThis = v->nOp; sqlite3VdbeAddOp4(v, OP_Explain, iThis, pParse->addrExplain, 0, zMsg, P4_DYNAMIC); - if( bPush) pParse->addrExplain = iThis; + sqlite3ExplainBreakpoint(bPush?"PUSH":"", sqlite3VdbeGetOp(v,-1)->p4.z); + if( bPush){ + pParse->addrExplain = iThis; + } } } @@ -346,6 +395,7 @@ void sqlite3VdbeExplain(Parse *pParse, u8 bPush, const char *zFmt, ...){ ** Pop the EXPLAIN QUERY PLAN stack one level. */ void sqlite3VdbeExplainPop(Parse *pParse){ + sqlite3ExplainBreakpoint("POP", 0); pParse->addrExplain = sqlite3VdbeExplainParent(pParse); } #endif /* SQLITE_OMIT_EXPLAIN */ @@ -410,21 +460,22 @@ void sqlite3VdbeEndCoroutine(Vdbe *v, int regYield){ ** The VDBE knows that a P2 value is a label because labels are ** always negative and P2 values are suppose to be non-negative. ** Hence, a negative P2 value is a label that has yet to be resolved. +** (Later:) This is only true for opcodes that have the OPFLG_JUMP +** property. ** -** Zero is returned if a malloc() fails. +** Variable usage notes: +** +** Parse.aLabel[x] Stores the address that the x-th label resolves +** into. For testing (SQLITE_DEBUG), unresolved +** labels stores -1, but that is not required. +** Parse.nLabelAlloc Number of slots allocated to Parse.aLabel[] +** Parse.nLabel The *negative* of the number of labels that have +** been issued. The negative is stored because +** that gives a performance improvement over storing +** the equivalent positive value. */ -int sqlite3VdbeMakeLabel(Vdbe *v){ - Parse *p = v->pParse; - int i = p->nLabel++; - assert( v->magic==VDBE_MAGIC_INIT ); - if( (i & (i-1))==0 ){ - p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, - (i*2+1)*sizeof(p->aLabel[0])); - } - if( p->aLabel ){ - p->aLabel[i] = -1; - } - return ADDR(i); +int sqlite3VdbeMakeLabel(Parse *pParse){ + return --pParse->nLabel; } /* @@ -432,18 +483,35 @@ int sqlite3VdbeMakeLabel(Vdbe *v){ ** be inserted. The parameter "x" must have been obtained from ** a prior call to sqlite3VdbeMakeLabel(). */ +static SQLITE_NOINLINE void resizeResolveLabel(Parse *p, Vdbe *v, int j){ + int nNewSize = 10 - p->nLabel; + p->aLabel = sqlite3DbReallocOrFree(p->db, p->aLabel, + nNewSize*sizeof(p->aLabel[0])); + if( p->aLabel==0 ){ + p->nLabelAlloc = 0; + }else{ +#ifdef SQLITE_DEBUG + int i; + for(i=p->nLabelAlloc; iaLabel[i] = -1; +#endif + p->nLabelAlloc = nNewSize; + p->aLabel[j] = v->nOp; + } +} void sqlite3VdbeResolveLabel(Vdbe *v, int x){ Parse *p = v->pParse; int j = ADDR(x); assert( v->magic==VDBE_MAGIC_INIT ); - assert( jnLabel ); + assert( j<-p->nLabel ); assert( j>=0 ); - if( p->aLabel ){ #ifdef SQLITE_DEBUG - if( p->db->flags & SQLITE_VdbeAddopTrace ){ - printf("RESOLVE LABEL %d to %d\n", x, v->nOp); - } + if( p->db->flags & SQLITE_VdbeAddopTrace ){ + printf("RESOLVE LABEL %d to %d\n", x, v->nOp); + } #endif + if( p->nLabelAlloc + p->nLabel < 0 ){ + resizeResolveLabel(p,v,j); + }else{ assert( p->aLabel[j]==(-1) ); /* Labels may only be resolved once */ p->aLabel[j] = v->nOp; } @@ -568,8 +636,9 @@ int sqlite3VdbeAssertMayAbort(Vdbe *v, int mayAbort){ while( (pOp = opIterNext(&sIter))!=0 ){ int opcode = pOp->opcode; if( opcode==OP_Destroy || opcode==OP_VUpdate || opcode==OP_VRename + || opcode==OP_VDestroy || ((opcode==OP_Halt || opcode==OP_HaltIfNull) - && ((pOp->p1&0xff)==SQLITE_CONSTRAINT && pOp->p2==OE_Abort)) + && ((pOp->p1)!=SQLITE_OK && pOp->p2==OE_Abort)) ){ hasAbort = 1; break; @@ -718,7 +787,7 @@ static void resolveP2Values(Vdbe *p, int *pMaxFuncArgs){ ** non-jump opcodes less than SQLITE_MX_JUMP_CODE are guaranteed to ** have non-negative values for P2. */ assert( (sqlite3OpcodeProperty[pOp->opcode] & OPFLG_JUMP)!=0 ); - assert( ADDR(pOp->p2)nLabel ); + assert( ADDR(pOp->p2)<-pParse->nLabel ); pOp->p2 = aLabel[ADDR(pOp->p2)]; } break; @@ -757,7 +826,7 @@ int sqlite3VdbeCurrentAddr(Vdbe *p){ */ #if defined(SQLITE_DEBUG) && !defined(SQLITE_TEST_REALLOC_STRESS) void sqlite3VdbeVerifyNoMallocRequired(Vdbe *p, int N){ - assert( p->nOp + N <= p->pParse->nOpAlloc ); + assert( p->nOp + N <= p->nOpAlloc ); } #endif @@ -829,7 +898,7 @@ VdbeOp *sqlite3VdbeAddOpList( VdbeOp *pOut, *pFirst; assert( nOp>0 ); assert( p->magic==VDBE_MAGIC_INIT ); - if( p->nOp + nOp > p->pParse->nOpAlloc && growOpArray(p, nOp) ){ + if( p->nOp + nOp > p->nOpAlloc && growOpArray(p, nOp) ){ return 0; } pFirst = pOut = &p->aOp[p->nOp]; @@ -2151,19 +2220,27 @@ void sqlite3VdbeMakeReady( ** the leftover memory at the end of the opcode array. This can significantly ** reduce the amount of memory held by a prepared statement. */ - do { - x.nNeeded = 0; - p->aMem = allocSpace(&x, p->aMem, nMem*sizeof(Mem)); - p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem)); - p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*)); - p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*)); + x.nNeeded = 0; + p->aMem = allocSpace(&x, 0, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, 0, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, 0, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, 0, nCursor*sizeof(VdbeCursor*)); #ifdef SQLITE_ENABLE_STMT_SCANSTATUS - p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); + p->anExec = allocSpace(&x, 0, p->nOp*sizeof(i64)); #endif - if( x.nNeeded==0 ) break; + if( x.nNeeded ){ x.pSpace = p->pFree = sqlite3DbMallocRawNN(db, x.nNeeded); x.nFree = x.nNeeded; - }while( !db->mallocFailed ); + if( !db->mallocFailed ){ + p->aMem = allocSpace(&x, p->aMem, nMem*sizeof(Mem)); + p->aVar = allocSpace(&x, p->aVar, nVar*sizeof(Mem)); + p->apArg = allocSpace(&x, p->apArg, nArg*sizeof(Mem*)); + p->apCsr = allocSpace(&x, p->apCsr, nCursor*sizeof(VdbeCursor*)); +#ifdef SQLITE_ENABLE_STMT_SCANSTATUS + p->anExec = allocSpace(&x, p->anExec, p->nOp*sizeof(i64)); +#endif + } + } p->pVList = pParse->pVList; pParse->pVList = 0; @@ -2855,7 +2932,7 @@ int sqlite3VdbeHalt(Vdbe *p){ }else{ db->nDeferredCons = 0; db->nDeferredImmCons = 0; - db->flags &= ~SQLITE_DeferFKs; + db->flags &= ~(u64)SQLITE_DeferFKs; sqlite3CommitInternalChanges(db); } }else{ @@ -3170,6 +3247,13 @@ void sqlite3VdbeClearObject(sqlite3 *db, Vdbe *p){ sqlite3DbFree(db, p->zSql); #ifdef SQLITE_ENABLE_NORMALIZE sqlite3DbFree(db, p->zNormSql); + { + DblquoteStr *pThis, *pNext; + for(pThis=p->pDblStr; pThis; pThis=pNext){ + pNext = pThis->pNextStr; + sqlite3DbFree(db, pThis); + } + } #endif #ifdef SQLITE_ENABLE_STMT_SCANSTATUS { @@ -3710,7 +3794,7 @@ void sqlite3VdbeRecordUnpack( UnpackedRecord *p /* Populate this structure before returning. */ ){ const unsigned char *aKey = (const unsigned char *)pKey; - int d; + u32 d; u32 idx; /* Offset in aKey[] to read from */ u16 u; /* Unsigned loop counter */ u32 szHdr; @@ -3721,7 +3805,7 @@ void sqlite3VdbeRecordUnpack( idx = getVarint32(aKey, szHdr); d = szHdr; u = 0; - while( idx=p->nField ) break; } + if( d>(u32)nKey && u ){ + assert( CORRUPT_DB ); + /* In a corrupt record entry, the last pMem might have been set up using + ** uninitialized memory. Overwrite its value with NULL, to prevent + ** warnings from MSAN. */ + sqlite3VdbeMemSetNull(pMem-1); + } assert( u<=pKeyInfo->nKeyField + 1 ); p->nField = u; } @@ -3799,8 +3890,8 @@ static int vdbeRecordCompareDebug( ** Use that approximation to avoid the more expensive call to ** sqlite3VdbeSerialTypeLen() in the common case. */ - if( d1+serial_type1+2>(u32)nKey1 - && d1+sqlite3VdbeSerialTypeLen(serial_type1)>(u32)nKey1 + if( d1+(u64)serial_type1+2>(u64)nKey1 + && d1+(u64)sqlite3VdbeSerialTypeLen(serial_type1)>(u64)nKey1 ){ break; } @@ -3811,7 +3902,8 @@ static int vdbeRecordCompareDebug( /* Do the comparison */ - rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], pKeyInfo->aColl[i]); + rc = sqlite3MemCompare(&mem1, &pPKey2->aMem[i], + pKeyInfo->nAllField>i ? pKeyInfo->aColl[i] : 0); if( rc!=0 ){ assert( mem1.szMalloc==0 ); /* See comment below */ if( pKeyInfo->aSortOrder[i] ){ @@ -4167,12 +4259,12 @@ int sqlite3VdbeRecordCompareWithSkip( }else{ idx1 = getVarint32(aKey1, szHdr1); d1 = szHdr1; - if( d1>(unsigned)nKey1 ){ - pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; - return 0; /* Corruption */ - } i = 0; } + if( d1>(unsigned)nKey1 ){ + pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; + return 0; /* Corruption */ + } VVA_ONLY( mem1.szMalloc = 0; ) /* Only needed by assert() statements */ assert( pPKey2->pKeyInfo->nAllField>=pPKey2->nField @@ -4242,10 +4334,12 @@ int sqlite3VdbeRecordCompareWithSkip( mem1.n = (serial_type - 12) / 2; testcase( (d1+mem1.n)==(unsigned)nKey1 ); testcase( (d1+mem1.n+1)==(unsigned)nKey1 ); - if( (d1+mem1.n) > (unsigned)nKey1 ){ + if( (d1+mem1.n) > (unsigned)nKey1 + || (pKeyInfo = pPKey2->pKeyInfo)->nAllField<=i + ){ pPKey2->errCode = (u8)SQLITE_CORRUPT_BKPT; return 0; /* Corruption */ - }else if( (pKeyInfo = pPKey2->pKeyInfo)->aColl[i] ){ + }else if( pKeyInfo->aColl[i] ){ mem1.enc = pKeyInfo->enc; mem1.db = pKeyInfo->db; mem1.flags = MEM_Str; diff --git a/src/vdbemem.c b/src/vdbemem.c index db8fedd..5aa0ec6 100644 --- a/src/vdbemem.c +++ b/src/vdbemem.c @@ -243,7 +243,7 @@ SQLITE_NOINLINE int sqlite3VdbeMemGrow(Mem *pMem, int n, int bPreserve){ ** if unable to complete the resizing. */ int sqlite3VdbeMemClearAndResize(Mem *pMem, int szNew){ - assert( szNew>0 ); + assert( CORRUPT_DB || szNew>0 ); assert( (pMem->flags & MEM_Dyn)==0 || pMem->szMalloc==0 ); if( pMem->szMallocflags = MEM_Null; + if( sqlite3BtreeMaxRecordSize(pCur)z); if( rc==SQLITE_OK ){ @@ -1530,9 +1533,11 @@ static int valueFromExpr( } #endif else if( op==TK_TRUEFALSE ){ - pVal = valueNew(db, pCtx); - pVal->flags = MEM_Int; - pVal->u.i = pExpr->u.zToken[4]==0; + pVal = valueNew(db, pCtx); + if( pVal ){ + pVal->flags = MEM_Int; + pVal->u.i = pExpr->u.zToken[4]==0; + } } *ppVal = pVal; diff --git a/src/vtab.c b/src/vtab.c index 1b8d283..8814b5f 100644 --- a/src/vtab.c +++ b/src/vtab.c @@ -1001,6 +1001,7 @@ int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ const sqlite3_module *pMod = pVTab->pMod->pModule; if( pVTab->pVtab && pMod->iVersion>=2 ){ int (*xMethod)(sqlite3_vtab *, int); + sqlite3VtabLock(pVTab); switch( op ){ case SAVEPOINT_BEGIN: xMethod = pMod->xSavepoint; @@ -1016,6 +1017,7 @@ int sqlite3VtabSavepoint(sqlite3 *db, int op, int iSavepoint){ if( xMethod && pVTab->iSavepoint>iSavepoint ){ rc = xMethod(pVTab->pVtab, iSavepoint); } + sqlite3VtabUnlock(pVTab); } } } diff --git a/src/walker.c b/src/walker.c index c31d94f..eff3585 100644 --- a/src/walker.c +++ b/src/walker.c @@ -17,6 +17,22 @@ #include +#if !defined(SQLITE_OMIT_WINDOWFUNC) +/* +** Walk all expressions linked into the list of Window objects passed +** as the second argument. +*/ +static int walkWindowList(Walker *pWalker, Window *pList){ + Window *pWin; + for(pWin=pList; pWin; pWin=pWin->pNextWin){ + if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort; + if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort; + if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort; + } + return WRC_Continue; +} +#endif + /* ** Walk an expression tree. Invoke the callback once for each node ** of the expression, while descending. (In other words, the callback @@ -56,10 +72,7 @@ static SQLITE_NOINLINE int walkExpr(Walker *pWalker, Expr *pExpr){ } #ifndef SQLITE_OMIT_WINDOWFUNC if( ExprHasProperty(pExpr, EP_WinFunc) ){ - Window *pWin = pExpr->y.pWin; - if( sqlite3WalkExprList(pWalker, pWin->pPartition) ) return WRC_Abort; - if( sqlite3WalkExprList(pWalker, pWin->pOrderBy) ) return WRC_Abort; - if( sqlite3WalkExpr(pWalker, pWin->pFilter) ) return WRC_Abort; + if( walkWindowList(pWalker, pExpr->y.pWin) ) return WRC_Abort; } #endif } @@ -99,6 +112,16 @@ int sqlite3WalkSelectExpr(Walker *pWalker, Select *p){ if( sqlite3WalkExpr(pWalker, p->pHaving) ) return WRC_Abort; if( sqlite3WalkExprList(pWalker, p->pOrderBy) ) return WRC_Abort; if( sqlite3WalkExpr(pWalker, p->pLimit) ) return WRC_Abort; +#if !defined(SQLITE_OMIT_WINDOWFUNC) && !defined(SQLITE_OMIT_ALTERTABLE) + { + Parse *pParse = pWalker->pParse; + if( pParse && IN_RENAME_OBJECT ){ + int rc = walkWindowList(pWalker, p->pWinDefn); + assert( rc==WRC_Continue ); + return rc; + } + } +#endif return WRC_Continue; } diff --git a/src/where.c b/src/where.c index 8e01660..a09f762 100644 --- a/src/where.c +++ b/src/where.c @@ -310,6 +310,17 @@ static WhereTerm *whereScanNext(WhereScan *pScan){ return 0; } +/* +** This is whereScanInit() for the case of an index on an expression. +** It is factored out into a separate tail-recursion subroutine so that +** the normal whereScanInit() routine, which is a high-runner, does not +** need to push registers onto the stack as part of its prologue. +*/ +static SQLITE_NOINLINE WhereTerm *whereScanInitIndexExpr(WhereScan *pScan){ + pScan->idxaff = sqlite3ExprAffinity(pScan->pIdxExpr); + return whereScanNext(pScan); +} + /* ** Initialize a WHERE clause scanner object. Return a pointer to the ** first match. Return NULL if there are no matches. @@ -342,12 +353,19 @@ static WhereTerm *whereScanInit( pScan->pIdxExpr = 0; pScan->idxaff = 0; pScan->zCollName = 0; + pScan->opMask = opMask; + pScan->k = 0; + pScan->aiCur[0] = iCur; + pScan->nEquiv = 1; + pScan->iEquiv = 1; if( pIdx ){ int j = iColumn; iColumn = pIdx->aiColumn[j]; if( iColumn==XN_EXPR ){ pScan->pIdxExpr = pIdx->aColExpr->a[j].pExpr; pScan->zCollName = pIdx->azColl[j]; + pScan->aiColumn[0] = XN_EXPR; + return whereScanInitIndexExpr(pScan); }else if( iColumn==pIdx->pTable->iPKey ){ iColumn = XN_ROWID; }else if( iColumn>=0 ){ @@ -357,12 +375,7 @@ static WhereTerm *whereScanInit( }else if( iColumn==XN_EXPR ){ return 0; } - pScan->opMask = opMask; - pScan->k = 0; - pScan->aiCur[0] = iCur; pScan->aiColumn[0] = iColumn; - pScan->nEquiv = 1; - pScan->iEquiv = 1; return whereScanNext(pScan); } @@ -837,7 +850,7 @@ static void constructAutomaticIndex( addrTop = sqlite3VdbeAddOp1(v, OP_Rewind, pLevel->iTabCur); VdbeCoverage(v); } if( pPartial ){ - iContinue = sqlite3VdbeMakeLabel(v); + iContinue = sqlite3VdbeMakeLabel(pParse); sqlite3ExprIfFalse(pParse, pPartial, iContinue, SQLITE_JUMPIFNULL); pLoop->wsFlags |= WHERE_PARTIALIDX; } @@ -854,6 +867,7 @@ static void constructAutomaticIndex( translateColumnToCopy(pParse, addrTop, pLevel->iTabCur, pTabItem->regResult, 1); sqlite3VdbeGoto(v, addrTop); + pTabItem->fg.viaCoroutine = 0; }else{ sqlite3VdbeAddOp2(v, OP_Next, pLevel->iTabCur, addrTop+1); VdbeCoverage(v); } @@ -2209,7 +2223,7 @@ static int whereLoopInsert(WhereLoopBuilder *pBuilder, WhereLoop *pTemplate){ rc = whereLoopXfer(db, p, pTemplate); if( (p->wsFlags & WHERE_VIRTUALTABLE)==0 ){ Index *pIndex = p->u.btree.pIndex; - if( pIndex && pIndex->tnum==0 ){ + if( pIndex && pIndex->idxType==SQLITE_IDXTYPE_IPK ){ p->u.btree.pIndex = 0; } } @@ -2376,8 +2390,8 @@ static int whereRangeVectorLen( ** terms only. If it is modified, this value is restored before this ** function returns. ** -** If pProbe->tnum==0, that means pIndex is a fake index used for the -** INTEGER PRIMARY KEY. +** If pProbe->idxType==SQLITE_IDXTYPE_IPK, that means pIndex is +** a fake index used for the INTEGER PRIMARY KEY. */ static int whereLoopAddBtreeIndex( WhereLoopBuilder *pBuilder, /* The WhereLoop factory */ @@ -2877,6 +2891,7 @@ static int whereLoopAddBtree( sPk.onError = OE_Replace; sPk.pTable = pTab; sPk.szIdxRow = pTab->szTabRow; + sPk.idxType = SQLITE_IDXTYPE_IPK; aiRowEstPk[0] = pTab->nRowLogEst; aiRowEstPk[1] = 0; pFirst = pSrc->pTab->pIndex; @@ -2967,7 +2982,7 @@ static int whereLoopAddBtree( b = indexMightHelpWithOrderBy(pBuilder, pProbe, pSrc->iCursor); /* The ONEPASS_DESIRED flags never occurs together with ORDER BY */ assert( (pWInfo->wctrlFlags & WHERE_ONEPASS_DESIRED)==0 || b==0 ); - if( pProbe->tnum<=0 ){ + if( pProbe->idxType==SQLITE_IDXTYPE_IPK ){ /* Integer primary key index */ pNew->wsFlags = WHERE_IPK; @@ -4643,7 +4658,7 @@ WhereInfo *sqlite3WhereBegin( pWInfo->pResultSet = pResultSet; pWInfo->aiCurOnePass[0] = pWInfo->aiCurOnePass[1] = -1; pWInfo->nLevel = nTabList; - pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(v); + pWInfo->iBreak = pWInfo->iContinue = sqlite3VdbeMakeLabel(pParse); pWInfo->wctrlFlags = wctrlFlags; pWInfo->iLimit = iAuxArg; pWInfo->savedNQueryLoop = pParse->nQueryLoop; @@ -4917,9 +4932,10 @@ WhereInfo *sqlite3WhereBegin( if( (wctrlFlags & WHERE_ONEPASS_DESIRED)!=0 ){ int wsFlags = pWInfo->a[0].pWLoop->wsFlags; int bOnerow = (wsFlags & WHERE_ONEROW)!=0; + assert( !(wsFlags & WHERE_VIRTUALTABLE) || IsVirtual(pTabList->a[0].pTab) ); if( bOnerow || ( 0!=(wctrlFlags & WHERE_ONEPASS_MULTIROW) - && 0==(wsFlags & WHERE_VIRTUALTABLE) + && !IsVirtual(pTabList->a[0].pTab) && (0==(wsFlags & WHERE_MULTI_OR) || (wctrlFlags & WHERE_DUPLICATES_OK)) )){ pWInfo->eOnePass = bOnerow ? ONEPASS_SINGLE : ONEPASS_MULTI; @@ -5074,7 +5090,7 @@ WhereInfo *sqlite3WhereBegin( pParse, pTabList, pLevel, wctrlFlags ); pLevel->addrBody = sqlite3VdbeCurrentAddr(v); - notReady = sqlite3WhereCodeOneLoopStart(pWInfo, ii, notReady); + notReady = sqlite3WhereCodeOneLoopStart(pParse,v,pWInfo,ii,pLevel,notReady); pWInfo->iContinue = pLevel->addrCont; if( (wsFlags&WHERE_MULTI_OR)==0 && (wctrlFlags&WHERE_OR_SUBCLAUSE)==0 ){ sqlite3WhereAddScanStatus(v, pTabList, pLevel, addrExplain); @@ -5259,6 +5275,29 @@ void sqlite3WhereEnd(WhereInfo *pWInfo){ continue; } +#ifdef SQLITE_ENABLE_EARLY_CURSOR_CLOSE + /* Close all of the cursors that were opened by sqlite3WhereBegin. + ** Except, do not close cursors that will be reused by the OR optimization + ** (WHERE_OR_SUBCLAUSE). And do not close the OP_OpenWrite cursors + ** created for the ONEPASS optimization. + */ + if( (pTab->tabFlags & TF_Ephemeral)==0 + && pTab->pSelect==0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 + ){ + int ws = pLoop->wsFlags; + if( pWInfo->eOnePass==ONEPASS_OFF && (ws & WHERE_IDX_ONLY)==0 ){ + sqlite3VdbeAddOp1(v, OP_Close, pTabItem->iCursor); + } + if( (ws & WHERE_INDEXED)!=0 + && (ws & (WHERE_IPK|WHERE_AUTO_INDEX))==0 + && pLevel->iIdxCur!=pWInfo->aiCurOnePass[1] + ){ + sqlite3VdbeAddOp1(v, OP_Close, pLevel->iIdxCur); + } + } +#endif + /* If this scan uses an index, make VDBE code substitutions to read data ** from the index instead of from the table where possible. In some cases ** this optimization prevents the table from ever being read, which can diff --git a/src/whereInt.h b/src/whereInt.h index 209ac42..07876f4 100644 --- a/src/whereInt.h +++ b/src/whereInt.h @@ -507,8 +507,11 @@ void sqlite3WhereAddScanStatus( # define sqlite3WhereAddScanStatus(a, b, c, d) ((void)d) #endif Bitmask sqlite3WhereCodeOneLoopStart( + Parse *pParse, /* Parsing context */ + Vdbe *v, /* Prepared statement under construction */ WhereInfo *pWInfo, /* Complete information about the WHERE clause */ int iLevel, /* Which level of pWInfo->a[] should be coded */ + WhereLevel *pLevel, /* The current level pointer */ Bitmask notReady /* Which tables are currently available */ ); diff --git a/src/wherecode.c b/src/wherecode.c index e371cb8..1931577 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -213,6 +213,7 @@ int sqlite3WhereExplainOneScan( } #endif zMsg = sqlite3StrAccumFinish(&str); + sqlite3ExplainBreakpoint("",zMsg); ret = sqlite3VdbeAddOp4(v, OP_Explain, sqlite3VdbeCurrentAddr(v), pParse->addrExplain, 0, zMsg,P4_DYNAMIC); } @@ -538,16 +539,17 @@ static int codeEqualityTerm( if( pLoop->aLTerm[i]->pExpr==pX ) nEq++; } + iTab = 0; if( (pX->flags & EP_xIsSelect)==0 || pX->x.pSelect->pEList->nExpr==1 ){ - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0); + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, 0, &iTab); }else{ sqlite3 *db = pParse->db; pX = removeUnindexableInClauseTerms(pParse, iEq, pLoop, pX); if( !db->mallocFailed ){ aiMap = (int*)sqlite3DbMallocZero(pParse->db, sizeof(int)*nEq); - eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap); - pTerm->pExpr->iTable = pX->iTable; + eType = sqlite3FindInIndex(pParse, pX, IN_INDEX_LOOP, 0, aiMap, &iTab); + pTerm->pExpr->iTable = iTab; } sqlite3ExprDelete(db, pX); pX = pTerm->pExpr; @@ -557,7 +559,6 @@ static int codeEqualityTerm( testcase( bRev ); bRev = !bRev; } - iTab = pX->iTable; sqlite3VdbeAddOp2(v, bRev ? OP_Last : OP_Rewind, iTab, 0); VdbeCoverageIf(v, bRev); VdbeCoverageIf(v, !bRev); @@ -565,7 +566,7 @@ static int codeEqualityTerm( pLoop->wsFlags |= WHERE_IN_ABLE; if( pLevel->u.in.nIn==0 ){ - pLevel->addrNxt = sqlite3VdbeMakeLabel(v); + pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); } i = pLevel->u.in.nIn; @@ -1076,7 +1077,9 @@ static void codeExprOrVector(Parse *pParse, Expr *p, int iReg, int nReg){ #ifndef SQLITE_OMIT_SUBQUERY if( (p->flags & EP_xIsSelect) ){ Vdbe *v = pParse->pVdbe; - int iSelect = sqlite3CodeSubselect(pParse, p, 0, 0); + int iSelect; + assert( p->op==TK_SELECT ); + iSelect = sqlite3CodeSubselect(pParse, p); sqlite3VdbeAddOp3(v, OP_Copy, iSelect, iReg, nReg-1); }else #endif @@ -1162,22 +1165,21 @@ static void whereIndexExprTrans( ** implementation described by pWInfo. */ Bitmask sqlite3WhereCodeOneLoopStart( + Parse *pParse, /* Parsing context */ + Vdbe *v, /* Prepared statement under construction */ WhereInfo *pWInfo, /* Complete information about the WHERE clause */ int iLevel, /* Which level of pWInfo->a[] should be coded */ + WhereLevel *pLevel, /* The current level pointer */ Bitmask notReady /* Which tables are currently available */ ){ int j, k; /* Loop counters */ int iCur; /* The VDBE cursor for the table */ int addrNxt; /* Where to jump to continue with the next IN case */ - int omitTable; /* True if we use the index only */ int bRev; /* True if we need to scan in reverse order */ - WhereLevel *pLevel; /* The where level to be coded */ WhereLoop *pLoop; /* The WhereLoop object being coded */ WhereClause *pWC; /* Decomposition of the entire WHERE clause */ WhereTerm *pTerm; /* A WHERE clause term */ - Parse *pParse; /* Parsing context */ sqlite3 *db; /* Database connection */ - Vdbe *v; /* The prepared stmt under constructions */ struct SrcList_item *pTabItem; /* FROM clause term being coded */ int addrBrk; /* Jump here to break out of the loop */ int addrHalt; /* addrBrk for the outermost loop */ @@ -1187,18 +1189,13 @@ Bitmask sqlite3WhereCodeOneLoopStart( Index *pIdx = 0; /* Index used by loop (if any) */ int iLoop; /* Iteration of constraint generator loop */ - pParse = pWInfo->pParse; - v = pParse->pVdbe; pWC = &pWInfo->sWC; db = pParse->db; - pLevel = &pWInfo->a[iLevel]; pLoop = pLevel->pWLoop; pTabItem = &pWInfo->pTabList->a[pLevel->iFrom]; iCur = pTabItem->iCursor; pLevel->notReady = notReady & ~sqlite3WhereGetMask(&pWInfo->sMaskSet, iCur); bRev = (pWInfo->revMask>>iLevel)&1; - omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 - && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; VdbeModuleComment((v, "Begin WHERE-loop%d: %s",iLevel,pTabItem->pTab->zName)); /* Create labels for the "break" and "continue" instructions @@ -1211,8 +1208,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( ** there are no IN operators in the constraints, the "addrNxt" label ** is the same as "addrBrk". */ - addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(v); - addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(v); + addrBrk = pLevel->addrBrk = pLevel->addrNxt = sqlite3VdbeMakeLabel(pParse); + addrCont = pLevel->addrCont = sqlite3VdbeMakeLabel(pParse); /* If this is the right table of a LEFT OUTER JOIN, allocate and ** initialize a memory cell that records if this table matches any @@ -1339,7 +1336,6 @@ Bitmask sqlite3WhereCodeOneLoopStart( pTerm = pLoop->aLTerm[0]; assert( pTerm!=0 ); assert( pTerm->pExpr!=0 ); - assert( omitTable==0 ); testcase( pTerm->wtFlags & TERM_VIRTUAL ); iReleaseReg = ++pParse->nMem; iRowidReg = codeEqualityTerm(pParse, pTerm, pLevel, 0, bRev, iReleaseReg); @@ -1358,7 +1354,6 @@ Bitmask sqlite3WhereCodeOneLoopStart( int memEndValue = 0; WhereTerm *pStart, *pEnd; - assert( omitTable==0 ); j = 0; pStart = pEnd = 0; if( pLoop->wsFlags & WHERE_BTM_LIMIT ) pStart = pLoop->aLTerm[j++]; @@ -1522,6 +1517,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( char *zEndAff = 0; /* Affinity for end of range constraint */ u8 bSeekPastNull = 0; /* True to seek past initial nulls */ u8 bStopAtNull = 0; /* Add condition to terminate at NULLs */ + int omitTable; /* True if we use the index only */ + pIdx = pLoop->u.btree.pIndex; iIdxCur = pLevel->iIdxCur; @@ -1723,6 +1720,8 @@ Bitmask sqlite3WhereCodeOneLoopStart( } /* Seek the table cursor, if required */ + omitTable = (pLoop->wsFlags & WHERE_IDX_ONLY)!=0 + && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0; if( omitTable ){ /* pIdx is a covering index. No need to access the main table. */ }else if( HasRowid(pIdx->pTable) ){ @@ -1757,8 +1756,13 @@ Bitmask sqlite3WhereCodeOneLoopStart( ** the cursor. In this case it is important to do the full evaluation, ** as the result of the expression may not be NULL, even if all table ** column values are. https://www.sqlite.org/src/info/7fa8049685b50b5a + ** + ** Also, do not do this when processing one index an a multi-index + ** OR clause, since the transformation will become invalid once we + ** move forward to the next index. + ** https://sqlite.org/src/info/4e8e4857d32d401f */ - if( pLevel->iLeftJoin==0 ){ + if( pLevel->iLeftJoin==0 && (pWInfo->wctrlFlags & WHERE_OR_SUBCLAUSE)==0 ){ whereIndexExprTrans(pIdx, iCur, iIdxCur, pWInfo); } @@ -1833,7 +1837,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( int regReturn = ++pParse->nMem; /* Register used with OP_Gosub */ int regRowset = 0; /* Register for RowSet object */ int regRowid = 0; /* Register holding rowid */ - int iLoopBody = sqlite3VdbeMakeLabel(v); /* Start of loop body */ + int iLoopBody = sqlite3VdbeMakeLabel(pParse);/* Start of loop body */ int iRetInit; /* Address of regReturn init */ int untestedTerms = 0; /* Some terms not completely tested */ int ii; /* Loop counter */ @@ -1949,6 +1953,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( pOrExpr = pAndExpr; } /* Loop through table entries that match term pOrTerm. */ + ExplainQueryPlan((pParse, 1, "INDEX %d", ii+1)); WHERETRACE(0xffff, ("Subplan for OR-clause:\n")); pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrExpr, 0, 0, wctrlFlags, iCovCur); @@ -2052,6 +2057,7 @@ Bitmask sqlite3WhereCodeOneLoopStart( /* Finish the loop through table entries that match term pOrTerm. */ sqlite3WhereEnd(pSubWInfo); + ExplainQueryPlanPop(pParse); } } } diff --git a/src/whereexpr.c b/src/whereexpr.c index dbb7f0d..db0a38d 100644 --- a/src/whereexpr.c +++ b/src/whereexpr.c @@ -777,6 +777,7 @@ static void exprAnalyzeOrTerm( ** and column is found but leave okToChngToIN false if not found. */ for(j=0; j<2 && !okToChngToIN; j++){ + Expr *pLeft = 0; pOrTerm = pOrWc->a; for(i=pOrWc->nTerm-1; i>=0; i--, pOrTerm++){ assert( pOrTerm->eOperator & WO_EQ ); @@ -800,6 +801,7 @@ static void exprAnalyzeOrTerm( } iColumn = pOrTerm->u.leftColumn; iCursor = pOrTerm->leftCursor; + pLeft = pOrTerm->pExpr->pLeft; break; } if( i<0 ){ @@ -819,7 +821,9 @@ static void exprAnalyzeOrTerm( assert( pOrTerm->eOperator & WO_EQ ); if( pOrTerm->leftCursor!=iCursor ){ pOrTerm->wtFlags &= ~TERM_OR_OK; - }else if( pOrTerm->u.leftColumn!=iColumn ){ + }else if( pOrTerm->u.leftColumn!=iColumn || (iColumn==XN_EXPR + && sqlite3ExprCompare(pParse, pOrTerm->pExpr->pLeft, pLeft, -1) + )){ okToChngToIN = 0; }else{ int affLeft, affRight; diff --git a/src/window.c b/src/window.c index f5deae9..b0d28c4 100644 --- a/src/window.c +++ b/src/window.c @@ -823,8 +823,7 @@ int sqlite3WindowRewrite(Parse *pParse, Select *p){ pSub = sqlite3SelectNew( pParse, pSublist, pSrc, pWhere, pGroupBy, pHaving, pSort, 0, 0 ); - p->pSrc = sqlite3SrcListAppend(db, 0, 0, 0); - assert( p->pSrc || db->mallocFailed ); + p->pSrc = sqlite3SrcListAppend(pParse, 0, 0, 0); if( p->pSrc ){ p->pSrc->a[0].pSelect = pSub; sqlite3SrcListAssignCursors(pParse, p->pSrc); @@ -881,6 +880,7 @@ void sqlite3WindowListDelete(sqlite3 *db, Window *p){ */ static Expr *sqlite3WindowOffsetExpr(Parse *pParse, Expr *pExpr){ if( 0==sqlite3ExprIsConstant(pExpr) ){ + if( IN_RENAME_OBJECT ) sqlite3RenameExprUnmap(pParse, pExpr); sqlite3ExprDelete(pParse->db, pExpr); pExpr = sqlite3ExprAlloc(pParse->db, TK_NULL, 0, 0); } @@ -1075,6 +1075,7 @@ static void windowCheckIntValue(Parse *pParse, int reg, int eCond){ VdbeCoverageNeverNullIf(v, eCond==0); VdbeCoverageNeverNullIf(v, eCond==1); VdbeCoverageNeverNullIf(v, eCond==2); + sqlite3MayAbort(pParse); sqlite3VdbeAddOp2(v, OP_Halt, SQLITE_ERROR, OE_Abort); sqlite3VdbeAppendP4(v, (void*)azErr[eCond], P4_STATIC); sqlite3ReleaseTempReg(pParse, regZero); @@ -1330,7 +1331,7 @@ static void windowReturnOneRow( || pFunc->zName==first_valueName ){ int csr = pWin->csrApp; - int lbl = sqlite3VdbeMakeLabel(v); + int lbl = sqlite3VdbeMakeLabel(pParse); int tmpReg = sqlite3GetTempReg(pParse); sqlite3VdbeAddOp2(v, OP_Null, 0, pWin->regResult); @@ -1353,7 +1354,7 @@ static void windowReturnOneRow( int nArg = pWin->pOwner->x.pList->nExpr; int iEph = pMWin->iEphCsr; int csr = pWin->csrApp; - int lbl = sqlite3VdbeMakeLabel(v); + int lbl = sqlite3VdbeMakeLabel(pParse); int tmpReg = sqlite3GetTempReg(pParse); if( nArg<3 ){ @@ -1614,8 +1615,8 @@ static void windowCodeRowExprStep( /* Allocate register and label for the "flush_partition" sub-routine. */ regFlushPart = ++pParse->nMem; - lblFlushPart = sqlite3VdbeMakeLabel(v); - lblFlushDone = sqlite3VdbeMakeLabel(v); + lblFlushPart = sqlite3VdbeMakeLabel(pParse); + lblFlushDone = sqlite3VdbeMakeLabel(pParse); regStart = ++pParse->nMem; regEnd = ++pParse->nMem; @@ -1725,7 +1726,7 @@ static void windowCodeRowExprStep( || pMWin->eStart==TK_PRECEDING || pMWin->eStart==TK_FOLLOWING ){ - int lblSkipInverse = sqlite3VdbeMakeLabel(v);; + int lblSkipInverse = sqlite3VdbeMakeLabel(pParse);; if( pMWin->eStart==TK_PRECEDING ){ sqlite3VdbeAddOp3(v, OP_IfPos, regStart, lblSkipInverse, 1); VdbeCoverage(v); @@ -1890,13 +1891,13 @@ static void windowCodeCacheStep( || (pMWin->eStart==TK_CURRENT && pMWin->eEnd==TK_UNBOUNDED) ); - lblEmpty = sqlite3VdbeMakeLabel(v); + lblEmpty = sqlite3VdbeMakeLabel(pParse); regNewPeer = pParse->nMem+1; pParse->nMem += nPeer; /* Allocate register and label for the "flush_partition" sub-routine. */ regFlushPart = ++pParse->nMem; - lblFlushPart = sqlite3VdbeMakeLabel(v); + lblFlushPart = sqlite3VdbeMakeLabel(pParse); csrLead = pParse->nTab++; regCtr = ++pParse->nMem; @@ -2133,6 +2134,7 @@ Window *sqlite3WindowDup(sqlite3 *db, Expr *pOwner, Window *p){ if( pNew ){ pNew->zName = sqlite3DbStrDup(db, p->zName); pNew->pFilter = sqlite3ExprDup(db, p->pFilter, 0); + pNew->pFunc = p->pFunc; pNew->pPartition = sqlite3ExprListDup(db, p->pPartition, 0); pNew->pOrderBy = sqlite3ExprListDup(db, p->pOrderBy, 0); pNew->eType = p->eType; diff --git a/test/altercol.test b/test/altercol.test index 6810aab..d71a9b0 100644 --- a/test/altercol.test +++ b/test/altercol.test @@ -778,6 +778,32 @@ do_execsql_test 19.1 { {CREATE VIEW v2(e) AS SELECT coalesce(t2.c,t1.f) FROM t1, t2 WHERE t1.b=t2.d} } +# 2019-01-08: https://www.sqlite.org/src/tktview/bc8d94f0fbd633fd9a051e3 +# +# ALTER TABLE RENAME COLUMN does not work for tables that have redundant +# UNIQUE constraints. +# +sqlite3 db :memory: +do_execsql_test 20.100 { + CREATE TABLE t1(aaa,b,c,UNIQUE(aaA),PRIMARY KEY(aAa),UNIQUE(aAA)); + ALTER TABLE t1 RENAME aaa TO bbb; + SELECT sql FROM sqlite_master WHERE name='t1'; +} {{CREATE TABLE t1(bbb,b,c,UNIQUE(bbb),PRIMARY KEY(bbb),UNIQUE(bbb))}} +do_execsql_test 20.105 { + DROP TABLE t1; + CREATE TABLE t1(aaa,b,c,UNIQUE(aaA),PRIMARY KEY(aAa),UNIQUE(aAA))WITHOUT ROWID; + ALTER TABLE t1 RENAME aaa TO bbb; + SELECT sql FROM sqlite_master WHERE name='t1'; +} {{CREATE TABLE t1(bbb,b,c,UNIQUE(bbb),PRIMARY KEY(bbb),UNIQUE(bbb))WITHOUT ROWID}} +do_execsql_test 20.110 { + DROP TABLE t1; + CREATE TABLE t1(aa UNIQUE,bb UNIQUE,cc UNIQUE,UNIQUE(aA),PRIMARY KEY(bB),UNIQUE(cC)); + ALTER TABLE t1 RENAME aa TO xx; + ALTER TABLE t1 RENAME bb TO yy; + ALTER TABLE t1 RENAME cc TO zz; + SELECT sql FROM sqlite_master WHERE name='t1'; +} {{CREATE TABLE t1(xx UNIQUE,yy UNIQUE,zz UNIQUE,UNIQUE(xx),PRIMARY KEY(yy),UNIQUE(zz))}} + finish_test diff --git a/test/altertab.test b/test/altertab.test index a364207..4a12f0d 100644 --- a/test/altertab.test +++ b/test/altertab.test @@ -505,5 +505,58 @@ do_execsql_test 15.5 { SELECT sql FROM sqlite_master WHERE name = 'y'; } {{CREATE VIEW y AS SELECT f2 AS f1 FROM x}} +#------------------------------------------------------------------------- +# Test that it is not possible to rename a shadow table in DEFENSIVE mode. +# +ifcapable fts3 { + proc vtab_command {method args} { + switch -- $method { + xConnect { + if {[info exists ::vtab_connect_sql]} { + execsql $::vtab_connect_sql + } + return "CREATE TABLE t1(a, b, c)" + } + + xBestIndex { + set clist [lindex $args 0] + if {[llength $clist]!=1} { error "unexpected constraint list" } + catch { array unset C } + array set C [lindex $clist 0] + if {$C(usable)} { + return "omit 0 cost 0 rows 1 idxnum 555 idxstr eq!" + } else { + return "cost 1000000 rows 0 idxnum 0 idxstr scan..." + } + } + } + + return {} + } + + register_tcl_module db + + sqlite3_db_config db DEFENSIVE 1 + + do_execsql_test 16.0 { + CREATE VIRTUAL TABLE y1 USING fts3; + } + + do_catchsql_test 16.1 { + INSERT INTO y1_segments VALUES(1, X'1234567890'); + } {1 {table y1_segments may not be modified}} + + do_catchsql_test 16.2 { + ALTER TABLE y1_segments RENAME TO abc; + } {1 {table y1_segments may not be altered}} + + do_execsql_test 16.3 { + ALTER TABLE y1 RENAME TO z1; + } + + do_execsql_test 16.4 { + SELECT * FROM z1_segments; + } +} finish_test diff --git a/test/altertab2.test b/test/altertab2.test index 2e4212c..be55de9 100644 --- a/test/altertab2.test +++ b/test/altertab2.test @@ -12,7 +12,7 @@ set testdir [file dirname $argv0] source $testdir/tester.tcl -set testprefix altertab +set testprefix altertab2 # If SQLITE_OMIT_ALTERTABLE is defined, omit this file. ifcapable !altertable { @@ -85,5 +85,266 @@ do_execsql_test 2.3 { {CREATE TABLE c3(x, FOREIGN KEY (x) REFERENCES "p3"(a))} } +#------------------------------------------------------------------------- +# Table name in WITH clauses that are part of views or triggers. +# +foreach {tn schema} { + 1 { + CREATE TABLE log_entry(col1, y); + CREATE INDEX i1 ON log_entry(col1); + } + + 2 { + CREATE TABLE t1(a, b, c); + CREATE TABLE t2(x); + CREATE TABLE log_entry(col1); + CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + INSERT INTO t2 SELECT col1 FROM log_entry; + END; + } + + 3 { + CREATE TABLE t1(a, b, c); + CREATE TABLE t2(x); + CREATE TABLE log_entry(col1); + CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + INSERT INTO t2 + WITH xyz(x) AS (SELECT col1 FROM log_entry) + SELECT x FROM xyz; + END; + } + + 4 { + CREATE TABLE log_entry(col1); + CREATE VIEW ttt AS + WITH xyz(x) AS (SELECT col1 FROM log_entry) + SELECT x FROM xyz; + } +} { + reset_db + do_execsql_test 3.$tn.1 $schema + set expect [db eval "SELECT sql FROM sqlite_master"] + set expect [string map {log_entry {"newname"}} $expect] + + do_execsql_test 3.$tn.2 { + ALTER TABLE log_entry RENAME TO newname; + SELECT sql FROM sqlite_master; + } $expect + + reset_db + do_execsql_test 3.$tn.3 $schema + set expect [db eval "SELECT sql FROM sqlite_master"] + set expect [string map {col1 newname} $expect] + + do_execsql_test 3.$tn.4 { + ALTER TABLE log_entry RENAME col1 TO newname; + SELECT sql FROM sqlite_master; + } $expect +} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 4.0 { + CREATE TABLE t1(a,b,c,d,e,f); + CREATE TRIGGER r1 AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN + UPDATE t1 SET (c,d)=(a,b); + END; +} + +do_execsql_test 4.1 { + ALTER TABLE t1 RENAME TO t1x; + SELECT sql FROM sqlite_master WHERE type = 'trigger'; +} { +{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.a NOT NULL BEGIN + UPDATE "t1x" SET (c,d)=(a,b); + END} +} + +do_execsql_test 4.2 { + ALTER TABLE t1x RENAME a TO aaa; + SELECT sql FROM sqlite_master WHERE type = 'trigger'; +} { +{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.aaa NOT NULL BEGIN + UPDATE "t1x" SET (c,d)=(aaa,b); + END} +} + +do_execsql_test 4.3 { + ALTER TABLE t1x RENAME d TO ddd; + SELECT sql FROM sqlite_master WHERE type = 'trigger'; +} { +{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.aaa NOT NULL BEGIN + UPDATE "t1x" SET (c,ddd)=(aaa,b); + END} +} + +#------------------------------------------------------------------------- +do_execsql_test 5.0 { + CREATE TABLE t2(a); + CREATE TRIGGER r2 AFTER INSERT ON t2 WHEN new.a NOT NULL BEGIN + SELECT a, sum(a) OVER w1 FROM t2 + WINDOW w1 AS ( + PARTITION BY a ORDER BY a + ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING + ), + w2 AS ( + PARTITION BY a + ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING + ); + END; +} {} + +do_execsql_test 5.0.1 { + INSERT INTO t2 VALUES(1); +} {} + +do_execsql_test 5.1 { + ALTER TABLE t2 RENAME TO t2x; + SELECT sql FROM sqlite_master WHERE name = 'r2'; +} { + {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.a NOT NULL BEGIN + SELECT a, sum(a) OVER w1 FROM "t2x" + WINDOW w1 AS ( + PARTITION BY a ORDER BY a + ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING + ), + w2 AS ( + PARTITION BY a + ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING + ); + END} +} + +do_execsql_test 5.2 { + ALTER TABLE t2x RENAME a TO aaaa; + SELECT sql FROM sqlite_master WHERE name = 'r2'; +} { + {CREATE TRIGGER r2 AFTER INSERT ON "t2x" WHEN new.aaaa NOT NULL BEGIN + SELECT aaaa, sum(aaaa) OVER w1 FROM "t2x" + WINDOW w1 AS ( + PARTITION BY aaaa ORDER BY aaaa + ROWS BETWEEN 2 PRECEDING AND 3 FOLLOWING + ), + w2 AS ( + PARTITION BY aaaa + ORDER BY rowid ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING + ); + END} +} + +do_execsql_test 5.3 { + INSERT INTO t2x VALUES(1); +} {} + +#------------------------------------------------------------------------- + +do_execsql_test 6.0 { + CREATE TABLE t3(a,b,c,d); + CREATE TRIGGER r3 AFTER INSERT ON t3 WHEN new.a NOT NULL BEGIN + SELECT a,b,c FROM t3 EXCEPT SELECT a,b,c FROM t3 ORDER BY a; + SELECT rowid, * FROM t3; + END; +} {} + +do_execsql_test 6.1 { + ALTER TABLE t3 RENAME TO t3x; + SELECT sql FROM sqlite_master WHERE name = 'r3'; +} { + {CREATE TRIGGER r3 AFTER INSERT ON "t3x" WHEN new.a NOT NULL BEGIN + SELECT a,b,c FROM "t3x" EXCEPT SELECT a,b,c FROM "t3x" ORDER BY a; + SELECT rowid, * FROM "t3x"; + END} +} + +do_execsql_test 6.2 { + ALTER TABLE t3x RENAME a TO abcd; + SELECT sql FROM sqlite_master WHERE name = 'r3'; +} { + {CREATE TRIGGER r3 AFTER INSERT ON "t3x" WHEN new.abcd NOT NULL BEGIN + SELECT abcd,b,c FROM "t3x" EXCEPT SELECT abcd,b,c FROM "t3x" ORDER BY abcd; + SELECT rowid, * FROM "t3x"; + END} +} + +#------------------------------------------------------------------------- +reset_db + +do_execsql_test 7.0 { + CREATE TABLE t1(a,b,c,d,e,f); + INSERT INTO t1 VALUES(1,2,3,4,5,6); + CREATE TABLE t2(x,y,z); +} + +do_execsql_test 7.1 { + SELECT a,b,c FROM t1 UNION SELECT d,e,f FROM t1 ORDER BY b,c; +} {1 2 3 4 5 6} + +do_execsql_test 7.2 { + CREATE TRIGGER r1 AFTER INSERT ON t1 BEGIN + INSERT INTO t2 + SELECT a,b,c FROM t1 UNION SELECT d,e,f FROM t1 ORDER BY b,c; + END; + INSERT INTO t1 VALUES(2,3,4,5,6,7); + SELECT * FROM t2; +} {1 2 3 2 3 4 4 5 6 5 6 7} + +do_execsql_test 7.3 { + ALTER TABLE t1 RENAME TO xyzzy; + SELECT sql FROM sqlite_master WHERE name='r1' +} { + {CREATE TRIGGER r1 AFTER INSERT ON "xyzzy" BEGIN + INSERT INTO t2 + SELECT a,b,c FROM "xyzzy" UNION SELECT d,e,f FROM "xyzzy" ORDER BY b,c; + END} +} + +do_execsql_test 7.3 { + ALTER TABLE xyzzy RENAME c TO ccc; + SELECT sql FROM sqlite_master WHERE name='r1' +} { + {CREATE TRIGGER r1 AFTER INSERT ON "xyzzy" BEGIN + INSERT INTO t2 + SELECT a,b,ccc FROM "xyzzy" UNION SELECT d,e,f FROM "xyzzy" ORDER BY b,ccc; + END} +} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 8.0 { + CREATE TABLE t1(a, b, c); + CREATE TABLE t2(a, b, c); + CREATE TABLE t3(d, e, f); + CREATE VIEW v1 AS SELECT * FROM t1; + CREATE TRIGGER tr AFTER INSERT ON t3 BEGIN + UPDATE t2 SET a = new.d; + SELECT a, b, c FROM v1; + END; +} + +do_execsql_test 8.1 { + INSERT INTO t3 VALUES(1, 2, 3); +} + +# The following ALTER TABLE fails as if column "t1.a" is renamed the "a" +# in the "SELECT a, b, c FROM v1" within the trigger can no longer be +# resolved. But at one point there was a bug allowing the ALTER TABLE +# succeed. Which meant the subsequent INSERT statement would fail. +do_catchsql_test 8.2 { + ALTER TABLE t1 RENAME a TO aaa; +} {1 {error in trigger tr after rename: no such column: a}} +do_execsql_test 8.3 { + INSERT INTO t3 VALUES(4, 5, 6); +} + +do_execsql_test 8.1 { + CREATE TABLE t4(a, b); + CREATE VIEW v4 AS SELECT * FROM t4 WHERE (a=1 AND 0) OR b=2; +} +do_execsql_test 8.2 { + ALTER TABLE t4 RENAME a TO c; + SELECT sql FROM sqlite_master WHERE name = 'v4' +} {{CREATE VIEW v4 AS SELECT * FROM t4 WHERE (c=1 AND 0) OR b=2}} finish_test + + diff --git a/test/altertab3.test b/test/altertab3.test new file mode 100644 index 0000000..28c0587 --- /dev/null +++ b/test/altertab3.test @@ -0,0 +1,86 @@ +# 2019 January 23 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix altertab3 + +# If SQLITE_OMIT_ALTERTABLE is defined, omit this file. +ifcapable !altertable { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE TABLE t1(a, b); + CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + SELECT sum(b) OVER w FROM t1 WINDOW w AS (ORDER BY a); + END; +} + +do_execsql_test 1.1 { + ALTER TABLE t1 RENAME a TO aaa; +} + +do_execsql_test 1.2 { + SELECT sql FROM sqlite_master WHERE name='tr1' +} {{CREATE TRIGGER tr1 AFTER INSERT ON t1 BEGIN + SELECT sum(b) OVER w FROM t1 WINDOW w AS (ORDER BY aaa); + END}} + +do_execsql_test 1.3 { + INSERT INTO t1 VALUES(1, 2); +} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 2.0 { + CREATE TABLE t1(a,b,c); + CREATE TABLE t2(a,b,c); + CREATE TRIGGER r1 AFTER INSERT ON t1 WHEN new.a NOT NULL BEGIN + SELECT a,b, a name FROM t1 + INTERSECT + SELECT a,b,c FROM t1 WHERE b>='d' ORDER BY name; + SELECT new.c; + END; +} + +do_execsql_test 2.1 { + ALTER TABLE t1 RENAME TO t1x; + SELECT sql FROM sqlite_master WHERE name = 'r1'; +} {{CREATE TRIGGER r1 AFTER INSERT ON "t1x" WHEN new.a NOT NULL BEGIN + SELECT a,b, a name FROM "t1x" + INTERSECT + SELECT a,b,c FROM "t1x" WHERE b>='d' ORDER BY name; + SELECT new.c; + END}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 3.0 { + CREATE TABLE t1(a, b, c, d); + CREATE VIEW v1 AS SELECT * FROM t1 WHERE a=1 OR (b IN ()); +} + +do_execsql_test 3.1 { + ALTER TABLE t1 RENAME b TO bbb; +} + +do_execsql_test 3.2 { + SELECT sql FROM sqlite_master WHERE name = 'v1' +} {{CREATE VIEW v1 AS SELECT * FROM t1 WHERE a=1 OR (bbb IN ())}} + + + +finish_test + + diff --git a/test/autoindex1.test b/test/autoindex1.test index 1978b8d..b08f8cf 100644 --- a/test/autoindex1.test +++ b/test/autoindex1.test @@ -184,7 +184,7 @@ do_eqp_test autoindex1-500.1 { } { QUERY PLAN |--SEARCH TABLE t501 USING INTEGER PRIMARY KEY (rowid=?) - `--LIST SUBQUERY + `--LIST SUBQUERY xxxxxx `--SCAN TABLE t502 } do_eqp_test autoindex1-501 { @@ -193,7 +193,7 @@ do_eqp_test autoindex1-501 { } { QUERY PLAN |--SCAN TABLE t501 - `--CORRELATED LIST SUBQUERY + `--CORRELATED LIST SUBQUERY xxxxxx `--SEARCH TABLE t502 USING AUTOMATIC COVERING INDEX (y=?) } do_eqp_test autoindex1-502 { @@ -203,7 +203,7 @@ do_eqp_test autoindex1-502 { } { QUERY PLAN |--SEARCH TABLE t501 USING INTEGER PRIMARY KEY (rowid=?) - `--CORRELATED LIST SUBQUERY + `--CORRELATED LIST SUBQUERY xxxxxx `--SCAN TABLE t502 } @@ -280,7 +280,7 @@ do_eqp_test autoindex1-600a { |--MATERIALIZE xxxxxx | |--SCAN TABLE sheep AS s | |--SEARCH TABLE flock_owner AS prev USING INDEX sqlite_autoindex_flock_owner_1 (flock_no=? AND owner_change_date? AND owner_change_date? AND x? AND x...|......... +| 1088: 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 13 ................ +| page 26 offset 102400 +| 2512: 00 00 00 00 00 00 00 0a 00 00 00 00 00 00 00 00 ................ +| page 27 offset 106496 +| 0: 00 00 00 00 00 00 00 12 00 00 00 07 00 00 00 1d ................ +| 16: 00 00 00 09 00 00 00 1f 00 00 00 0b 00 00 00 21 ...............! +| 32: 00 00 00 0d 00 00 00 25 00 00 00 0f 00 00 00 19 .......%........ +| 48: 00 00 00 11 00 00 00 29 00 00 00 13 00 00 00 2b .......).......+ +| 64: 00 00 00 15 00 00 00 2d 00 00 00 2e 00 00 00 17 .......-........ +| page 28 offset 110592 +| 2512: 00 00 00 00 00 00 00 1e 00 00 00 00 00 00 00 00 ................ +| page 30 offset 118784 +| 2512: 00 00 00 00 00 00 00 32 00 00 00 00 00 00 00 00 .......2........ +| page 32 offset 126976 +| 2512: 00 00 00 00 00 00 00 46 00 00 00 00 00 00 00 00 .......F........ +| page 34 offset 135168 +| 2512: 00 00 00 00 00 00 00 5a 00 00 00 00 00 00 00 00 .......Z........ +| page 35 offset 139264 +| 0: 0a 08 44 00 05 02 77 00 0e 11 0a 33 06 55 02 77 ..D...w....3.U.w +| 16: 04 66 00 88 00 88 00 88 00 00 00 00 00 00 00 00 .f.............. +| 128: 00 00 00 00 00 00 00 00 04 66 01 ef 00 00 00 00 .........f...... +| 624: 00 00 00 00 00 00 00 97 3d 04 ae 7c 01 00 00 00 ........=..|.... +| 1120: 00 00 00 00 00 20 97 3d 04 ae 7c 01 00 00 00 00 ..... .=..|..... +| 1616: 00 00 00 00 22 97 3d 04 ae 7c 01 00 00 00 00 00 ......=..|...... +| 2112: 00 00 00 1e 0c 22 01 ef 00 00 00 00 00 00 00 00 ................ +| 2608: 00 00 00 97 3d 04 ae 7c 01 00 00 00 00 00 00 00 ....=..|........ +| 3104: 00 1c 00 00 01 ef 00 00 00 00 00 00 00 00 00 00 ................ +| 3600: 00 97 3d 04 ae 7c 01 00 00 00 00 00 00 00 00 00 ..=..|.......... +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1a ................ +| page 36 offset 143360 +| 0: 0a 08 44 00 04 02 77 00 06 55 02 77 04 66 0e 11 ..D...w..U.w.f.. +| 16: 00 88 00 88 00 88 0e 11 00 00 00 00 00 00 00 00 ................ +| 128: 00 00 00 00 00 00 00 00 04 76 01 ef 00 00 00 00 .........v...... +| 624: 00 00 00 00 00 00 00 97 3e 04 ae 7c 02 00 00 00 ........>..|.... +| 1120: 00 00 00 00 00 2a 97 3e 04 ae 7c 02 00 00 00 00 .....*.>..|..... +| 1616: 00 00 00 00 2c 97 3e 04 ae 7c 02 00 00 00 00 00 ....,.>..|...... +| 2112: 00 00 00 28 00 00 05 cd 00 00 00 00 00 00 00 00 ...(............ +| 3600: 00 97 3e 04 ae 7c 02 00 00 00 00 00 00 00 00 00 ..>..|.......... +| 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2f .............../ +| page 38 offset 151552 +| 2512: 00 00 00 00 00 00 00 6e 00 00 00 00 00 00 00 00 .......n........ +| page 40 offset 159744 +| 2512: 00 00 00 00 00 00 00 00 82 00 00 00 00 00 00 00 ................ +| page 42 offset 167936 +| 2512: 00 00 00 00 00 00 00 00 96 00 00 00 00 00 00 00 ................ +| page 44 offset 176128 +| 2512: 00 00 00 00 00 00 00 00 aa 00 00 00 00 00 00 00 ................ +| page 47 offset 188416 +| 2512: 00 00 00 00 00 00 00 00 be 00 00 00 00 00 00 00 ................ +| end crash-9ae5502296c949.db +}]} {} + +do_catchsql_test 5.1 { + INSERT INTO t1(b) VALUES(zeroblob(40000)); +} {1 {database disk image is malformed}} + +do_catchsql_test 5.2 { + DROP INDEX t1x2; +} {0 {}} + +do_catchsql_test 5.3 { + INSERT INTO t1(b) VALUES(zeroblob(40000)); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 6.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 20480 pagesize 4096 filename crash-d260f001fa015c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 05 .....@ ........ +| 32: 00 00 00 00 00 ff ff f0 00 00 00 02 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 64 00 00 00 01 00 00 00 00 .......d........ +| 96: 00 00 00 00 0d 0f f8 00 04 0e ce 00 0f 4c 0f d3 .............L.. +| 112: 0e fa 0e ce 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 3776: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 2a 04 ..............*. +| 3792: 06 17 13 11 01 3f 69 6e 64 65 78 74 31 62 74 31 .....?indext1bt1 +| 3808: 05 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 .CREATE INDEX t1 +| 3824: 62 20 4f 4e 20 74 31 28 62 29 50 03 06 17 2b 2b b ON t1(b)P...++ +| 3840: 01 59 74 61 62 6c 65 73 71 6c 69 74 65 5f 73 65 .Ytablesqlite_se +| 3856: 71 75 65 6e 63 65 73 71 6c 69 74 65 5f 73 65 71 quencesqlite_seq +| 3872: 75 65 6e 63 65 04 43 52 45 41 54 45 20 54 41 42 uence.CREATE TAB +| 3888: 4c 45 20 73 71 6c 69 74 65 5f 73 65 71 75 65 6e LE sqlite_sequen +| 3904: 63 65 28 6e 61 6d 65 2c 73 65 71 29 81 04 01 07 ce(name,seq).... +| 3920: 17 11 11 01 81 73 74 61 c2 6c 65 74 31 74 31 02 .....sta.let1t1. +| 3936: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28 CREATE TABLE t1( +| 3952: 61 20 52 45 41 4c 20 4e 4f 54 20 4e 55 4c 4c 20 a REAL NOT NULL +| 3968: 44 45 46 41 55 4c 54 28 32 35 2b 33 32 29 2c 62 DEFAULT(25+32),b +| 3984: 20 46 4c 4f 41 54 2c 63 20 44 4f 55 42 4c 45 20 FLOAT,c DOUBLE +| 4000: 55 4e 49 51 55 45 2c 0a 64 20 43 4c 4f 42 2c 65 UNIQUE,.d CLOB,e +| 4016: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 4032: 20 4b 45 59 20 41 55 54 4f 49 4e 43 52 45 4d 45 KEY AUTOINCREME +| 4048: 4e 54 29 23 02 06 17 37 11 01 00 69 6e 64 65 78 NT)#...7...index +| 4064: 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e 64 65 78 sqlite_autoindex +| 4080: 5f 74 31 5f 31 74 31 05 00 00 00 08 00 00 00 00 _t1_1t1......... +| page 2 offset 4096 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 3 offset 8192 +| 0: 0a 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0a 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| end crash-d260f001fa015c.db +}]} {} + +do_catchsql_test 6.1 { + BEGIN; + INSERT INTO t1(b) VALUES(1); + INSERT INTO t1(b) VALUES(2); + COMMIT; +} {1 {malformed database schema (t1b) - invalid rootpage}} + +#------------------------------------------------------------------------- +reset_db +do_test 7.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 20480 pagesize 4096 filename crash-8391315d75edff.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 05 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 00 00 00 05 0e 55 00 0f 74 0f 3c ..........U..t.< +| 112: 0e f9 0e d1 0e 55 00 00 00 00 00 00 00 00 00 00 .....U.......... +| 3664: 00 00 00 00 00 7a 05 07 15 11 11 08 81 63 76 69 .....z.......cvi +| 3680: 65 77 76 31 76 31 43 52 45 41 54 45 20 56 49 45 ewv1v1CREATE VIE +| 3696: 57 20 76 31 28 78 2c 69 29 20 41 53 0a 53 45 4c W v1(x,i) AS.SEL +| 3712: 45 43 54 20 74 31 2e 62 2c 74 32 2e 62 20 46 52 ECT t1.b,t2.b FR +| 3728: 4f 4d 20 74 31 2c 74 32 20 57 48 45 52 45 20 74 OM t1,t2 WHERE t +| 3744: 31 2e 61 3d 74 32 2e 61 20 47 52 4f 55 50 20 42 1.a=t2.a GROUP B +| 3760: 59 20 31 20 48 41 56 49 4e 47 20 74 32 2e 63 20 Y 1 HAVING t2.c +| 3776: 4e 4f 54 20 4e 55 4c 4c 0a 4c 49 4d 49 54 20 31 NOT NULL.LIMIT 1 +| 3792: 30 26 04 06 17 11 11 01 39 74 61 62 6c 65 74 32 0&......9tablet2 +| 3808: 74 32 05 43 52 45 41 54 45 20 54 41 42 4c 45 20 t2.CREATE TABLE +| 3824: 74 32 28 61 2c 62 2c 63 29 41 03 06 17 15 11 01 t2(a,b,c)A...... +| 3840: 6b 69 6e 64 65 78 74 31 78 31 74 31 03 43 52 45 kindext1x1t1.CRE +| 3856: 41 54 45 20 49 4e 44 45 58 20 74 31 78 31 20 4f ATE INDEX t1x1 O +| 3872: 4e 20 74 31 28 64 29 20 57 48 45 52 45 20 65 65 N t1(d) WHERE ee +| 3888: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 36 02 06 17 IS NOT NULL6... +| 3904: 17 11 01 53 69 6e 64 65 78 74 31 61 62 63 74 31 ...Sindext1abct1 +| 3920: 03 43 52 45 41 54 45 20 49 4e 44 45 58 20 74 31 .CREATE INDEX t1 +| 3936: 61 62 63 20 4f 4e 20 74 31 28 61 2c 62 2c 63 2b abc ON t1(a,b,c+ +| 3952: 64 2b 65 29 81 09 01 07 17 11 11 01 81 7d 74 61 d+e)..........ta +| 3968: 62 6c 65 74 31 74 31 02 43 52 45 41 54 45 20 54 blet1t1.CREATE T +| 3984: 41 42 4c 45 20 74 31 28 61 2c 62 2c 63 2c 64 2c ABLE t1(a,b,c,d, +| 4000: 65 2c 66 2c 67 2c 68 2c 6a 2c 6a 6a 2c 6a 6a 6a e,f,g,h,j,jj,jjj +| 4016: 2c 6b 2c 61 61 2c 62 69 8c 63 63 2c 64 64 2c 65 ,k,aa,bi.cc,dd,e +| 4032: 65 20 44 45 46 41 55 4c 54 20 33 2e 31 34 2c 0a e DEFAULT 3.14,. +| 4048: 66 66 20 44 45 46 41 55 4c 54 28 27 68 69 63 63 ff DEFAULT('hicc +| 4064: 75 70 27 29 2c 67 67 20 4e 4f 54 20 4e 55 4c 4c up'),gg NOT NULL +| 4080: 20 44 45 46 41 55 4c 54 28 66 61 6c 73 65 29 29 DEFAULT(false)) +| page 2 offset 4096 +| 0: 0d 00 00 00 0a 0e 7b 00 0f dc 0f b6 0f 8f 0f 68 ...............h +| 16: 0f 41 0f 1a 0e f3 0e cb 0e a3 0e 22 00 00 00 00 .A.............. +| 3696: 00 00 00 00 00 00 00 00 00 00 00 26 0a 14 01 01 ...........&.... +| 3712: 02 08 00 00 00 00 00 00 00 00 00 00 00 00 07 19 ................ +| 3728: 08 09 5a 00 b4 40 09 1e b8 51 eb 95 1f 68 69 63 ..Z..@...Q...hic +| 3744: 63 75 70 26 09 14 01 01 02 08 00 00 00 00 00 00 cup&............ +| 3760: 00 00 00 00 00 00 07 19 08 08 50 00 a0 40 09 1e ..........P..@.. +| 3776: b8 51 eb 85 1f 68 69 63 63 74 70 26 08 14 01 01 .Q...hicctp&.... +| 3792: 03 08 00 00 00 00 00 00 00 00 00 00 00 00 07 19 ................ +| 3808: 08 07 46 00 8c 40 09 1e b8 51 eb 85 1f 68 69 63 ..F..@...Q...hic +| 3824: 63 75 70 25 07 14 01 01 01 08 00 00 00 00 00 00 cup%............ +| 3840: 00 00 00 00 00 10 07 19 08 06 3c 78 40 09 1e b8 ..........? AND b? AND b? AND b? AND b....!..... + | page 5 offset 2048 + | 0: 0a 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 ................ + | page 7 offset 3072 + | 0: 0d 00 00 00 08 01 c2 00 01 fb 01 f6 01 f1 01 ec ................ + | 16: 01 e0 01 d4 01 cb 01 c2 00 00 00 00 00 00 00 00 ................ + | 96: 00 00 00 00 13 00 00 00 00 00 00 00 00 00 00 00 ................ + | 224: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 02 ................ + | 288: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 03 ................ + | 448: 00 00 07 08 02 17 65 69 67 68 74 07 07 02 17 65 ......eight....e + | 464: 69 67 68 74 0a 06 02 07 40 18 00 00 00 00 00 00 ight....@....... + | 480: 0a 05 02 07 40 18 00 00 00 00 00 00 03 04 02 01 ....@........... + | 496: 04 03 03 02 01 04 03 02 02 01 02 03 01 02 01 02 ................ + | page 8 offset 3584 + | 0: 0d 00 21 00 01 00 16 00 00 16 00 16 00 16 00 16 ..!............. + | 16: 00 16 00 16 00 00 09 06 05 01 01 01 01 04 04 03 ................ + | 32: 03 00 00 00 5f 01 09 09 02 02 00 00 00 56 17 17 ...._........V.. + | 48: 17 73 65 76 65 6e 65 69 67 68 74 65 69 67 68 74 .seveneighteight + | 64: 73 65 76 65 6e 00 00 00 3b 07 07 07 40 14 00 00 seven...;...@... + | 80: 00 00 00 00 40 18 00 00 00 00 00 00 40 18 00 00 ....@.......@... + | 96: 00 00 00 00 40 14 00 00 00 00 00 00 00 00 00 14 ....@........... + | 112: 01 01 01 03 04 04 03 00 00 00 09 01 01 09 02 02 ................ + | 352: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 1a ................ + | page 9 offset 4096 + | 0: 0d 00 00 00 1b 00 47 00 01 d9 01 be 01 af 01 a0 ......G......... + | 16: 01 91 01 82 01 73 01 64 01 55 01 46 01 37 01 28 .....s.d.U.F.7.( + | 32: 01 19 01 0a 00 fb 00 ec 00 dd 00 ce 00 bf 00 b0 ................ + | 48: 00 a1 00 92 00 83 00 74 00 65 00 56 00 47 00 00 .......t.e.V.G.. + | 64: 00 00 00 00 00 00 00 0d 21 00 00 48 01 54 00 01 ........!..H.T.. + | 80: f7 01 ec 01 c5 01 0d 20 00 00 48 01 54 00 01 f7 ....... ..H.T... + | 96: 01 ec 01 c5 01 0d 1f 00 00 48 01 54 00 01 f7 01 .........H.T.... + | 112: ec 01 c5 01 0d 1e 00 00 48 01 54 00 01 f7 01 ec ........H.T..... + | 128: 01 c5 01 0d 1d 00 00 48 01 54 00 01 f7 01 ec 01 .......H.T...... + | 144: c5 01 0d 1c 00 00 48 01 54 00 01 f7 01 ec 01 c5 ......H.T....... + | 160: 01 0d 1b 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 .....H.T........ + | 176: 0d 1a 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d ....H.T......... + | 192: 19 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 18 ...H.T.......... + | 208: 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 17 00 ..H.T........... + | 224: 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 16 00 00 .H.T............ + | 240: 48 01 54 00 01 f7 01 ec 01 c5 01 0d 15 00 00 48 H.T............H + | 256: 01 54 00 01 f7 01 ec 01 c5 01 0d 14 00 00 48 01 .T............H. + | 272: 54 00 01 f7 01 ec 01 c5 01 0d 13 00 00 48 01 54 T............H.T + | 288: 00 01 f7 01 ec 01 c5 01 0d 12 00 00 48 01 54 00 ............H.T. + | 304: 01 f7 01 ec 01 c5 01 0d 11 00 00 48 01 54 00 01 ...........H.T.. + | 320: f7 01 ec 01 c5 01 0d 10 00 00 48 01 54 00 01 f7 ..........H.T... + | 336: 01 ec 01 c5 01 0d 0f 00 00 48 01 54 00 01 f7 01 .........H.T.... + | 352: ec 01 c5 01 0d 0e 00 00 48 01 54 00 01 f7 01 ec ........H.T..... + | 368: 01 c5 01 0d 0d 00 00 48 01 54 00 01 f7 01 ec 01 .......H.T...... + | 384: c5 01 0d 0c 00 00 48 01 54 00 01 f7 01 ec 01 c5 ......H.T....... + | 400: 01 0d 0b 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 .....H.T........ + | 416: 0d 0a 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d ....H.T......... + | 432: 09 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 19 08 ...H.T.......... + | 448: 05 17 17 17 17 65 69 67 68 74 65 69 67 68 74 73 .....eighteights + | 464: 65 76 65 6e 73 65 76 65 6e 25 07 05 07 07 07 07 evenseven%...... + | 480: 40 18 00 00 00 00 00 00 40 18 00 00 00 00 00 00 @.......@....... + | 496: 40 14 00 00 00 00 00 00 40 14 00 00 00 00 00 00 @.......@....... + | page 10 offset 4608 + | 0: 0d 00 00 00 1d 00 4d 00 01 f1 01 e2 01 d3 01 c4 ......M......... + | 16: 01 b5 01 a6 01 97 01 88 01 79 01 6a 01 5b 01 4c .........y.j.[.L + | 32: 01 3d 01 2e 01 1f 01 10 01 01 00 f2 00 e3 00 d4 .=.............. + | 48: 00 c5 00 b6 00 a7 00 98 00 89 00 7a 00 6b 00 5c ...........z.k.\ + | 64: 00 4d 00 00 00 00 00 00 00 00 00 00 00 0d 3e 00 .M............>. + | 80: 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 3d 00 00 .H.T.........=.. + | 96: 48 01 54 00 01 f7 01 ec 01 c5 01 0d 3c 00 00 48 H.T.........<..H + | 112: 01 54 00 01 f7 01 ec 01 c5 01 0d 3b 00 00 48 01 .T.........;..H. + | 128: 54 00 01 f7 01 ec 01 c5 01 0d 3a 00 00 48 01 54 T.........:..H.T + | 144: 00 01 f7 01 ec 01 c5 01 0d 39 00 00 48 01 54 00 .........9..H.T. + | 160: 01 f7 01 ec 01 c5 01 0d 38 00 00 48 01 54 00 01 ........8..H.T.. + | 176: f7 01 ec 01 c5 01 0d 37 00 00 48 01 54 00 01 f7 .......7..H.T... + | 192: 01 ec 01 c5 01 0d 36 00 00 48 01 54 00 01 f7 01 ......6..H.T.... + | 208: ec 01 c5 01 0d 35 00 00 48 01 54 00 01 f7 01 ec .....5..H.T..... + | 224: 01 c5 01 0d 34 00 00 48 01 54 00 01 f7 01 ec 01 ....4..H.T...... + | 240: c5 01 0d 33 00 00 48 01 54 00 01 f7 01 ec 01 c5 ...3..H.T....... + | 256: 01 0d 32 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 ..2..H.T........ + | 272: 0d 31 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d .1..H.T......... + | 288: 30 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 2f 0..H.T........./ + | 304: 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 2e 00 ..H.T........... + | 320: 00 48 01 54 00 01 f7 01 ec 01 c5 01 0d 2d 00 00 .H.T.........-.. + | 336: 48 01 54 00 01 f7 01 ec 01 c5 01 0d 2c 00 00 48 H.T.........,..H + | 352: 01 54 00 01 f7 01 ec 01 c5 01 0d 2b 00 00 48 01 .T.........+..H. + | 368: 54 00 01 f7 01 ec 01 c5 01 0d 2a 00 00 48 01 54 T.........*..H.T + | 384: 00 01 f7 01 ec 01 c5 01 0d 29 00 00 48 01 54 00 .........)..H.T. + | 400: 01 f7 01 ec 01 c5 01 0d 28 00 00 48 01 54 00 01 ........(..H.T.. + | 416: f7 01 ec 01 c5 01 0d 27 00 00 48 01 54 00 01 f7 .......'..H.T... + | 432: 01 ec 01 c5 01 0d 26 00 00 48 01 54 00 01 f7 01 ......&..H.T.... + | 448: ec 01 c5 01 0d 25 00 00 48 01 54 00 01 f7 01 ec .....%..H.T..... + | 464: 01 c5 01 0d 24 00 00 48 01 54 00 01 f7 01 ec 01 ....$..H.T...... + | 480: c5 01 0d 23 00 00 48 01 54 00 01 f7 01 ec 01 c5 ...#..H.T....... + | 496: 01 0d 22 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 .."..H.T........ + | page 11 offset 5120 + | 0: 0d 00 00 00 0a 01 6a 00 01 f1 01 e2 01 d3 01 c4 ......j......... + | 16: 01 b5 01 a6 01 97 01 88 01 79 01 6a 00 00 00 00 .........y.j.... + | 352: 00 00 00 00 00 00 00 00 00 00 0d 48 00 00 48 01 ...........H..H. + | 368: 54 00 01 f7 01 ec 01 c5 01 0d 47 00 00 48 01 54 T.........G..H.T + | 384: 00 01 f7 01 ec 01 c5 01 0d 46 00 00 48 01 54 00 .........F..H.T. + | 400: 01 f7 01 ec 01 c5 01 0d 45 00 00 48 01 54 00 01 ........E..H.T.. + | 416: f7 01 ec 01 c5 01 0d 44 00 00 48 01 54 00 01 f7 .......D..H.T... + | 432: 01 ec 01 c5 01 0d 43 00 00 48 01 54 00 01 f7 01 ......C..H.T.... + | 448: ec 01 c5 01 0d 42 00 00 48 01 54 00 01 f7 01 ec .....B..H.T..... + | 464: 01 c5 01 0d 41 00 00 48 01 54 00 01 f7 01 ec 01 ....A..H.T...... + | 480: c5 01 0d 40 00 00 48 01 54 00 01 f7 01 ec 01 c5 ...@..H.T....... + | 496: 01 0d 3f 00 00 48 01 54 00 01 f7 01 ec 01 c5 01 ..?..H.T........ + | end c4.db + }] +} {} + +ifcapable !oversize_cell_check { + # Non SQLITE_ENABLE_OVERSIZE_CELL_CHECK builds: + do_test dbfuzz001-101a { + db eval {PRAGMA writable_schema=on; PRAGMA integrity_check} + } {/Fragmentation of 384 bytes reported as 0 on page 8/} +} else { + # SQLITE_ENABLE_OVERSIZE_CELL_CHECK builds: + do_catchsql_test dbfuzz001-101b { + PRAGMA writable_schema=on; + PRAGMA integrity_check; + } {1 {database disk image is malformed}} +} + +# The DELETE query below deletes the very last cell from page 8. +# Prior to a certain fix to sqlite3BtreeDelete() and because of the +# corruption to the freeblock list on page 8, this would fail to +# cause a rebalance operation, which would leave the btree in a weird +# state that would lead to segfaults and or assertion faults. +# +set res {0 {}} +ifcapable oversize_cell_check { set res {1 {database disk image is malformed}} } +do_catchsql_test dbfuzz001-110 { + DELETE FROM t3 WHERE x IS NOT NULL AND +rowid=6; +} $res + +# This is a dbfuzz2-generate test case that can cause a page with +# pPage->nCell==0 to enter the balancer. +# +do_test dbfuzz001-200 { + db deserialize [decode_hexdb { + | size 3076 pagesize 512 filename c03.db + | page 1 offset 0 + | 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. + | 16: 02 00 01 01 00 40 20 20 00 00 00 0c 00 00 00 07 .....@ ........ + | 32: 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 04 ................ + | 48: 00 00 00 00 00 00 00 03 e8 00 00 01 00 00 00 00 ................ + | 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c ................ + | 96: 00 2e 2c 50 0d 00 00 00 06 01 06 00 01 da 01 b0 ..,P............ + | 112: 01 56 01 86 01 2a 01 06 00 00 00 00 00 00 00 00 .V...*.......... + | 128: 00 00 00 00 00 00 00 00 ef 00 00 00 00 00 00 00 ................ + | 192: 00 7f 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + | 224: 00 00 00 00 00 00 00 00 00 00 00 00 00 ff e9 00 ................ + | 256: 00 00 00 00 00 00 22 07 06 17 11 11 01 31 74 61 ......"......1ta + | 272: 62 6c 65 74 34 74 34 07 43 52 45 41 54 45 20 54 blet4t4.CREATE T + | 288: 41 42 4c 45 20 74 34 28 78 29 2a 06 06 17 13 11 ABLE t4(x)*..... + | 304: 01 3f 69 6e 64 65 78 74 33 78 74 33 06 43 52 45 .?indext3xt3.CRE + | 320: 41 54 45 20 49 4e 44 45 58 20 74 33 64 20 4f 4e ATE INDEX t3d ON + | 336: 20 74 33 28 78 29 2e 04 06 17 15 11 01 45 69 6e t3(x).......Ein + | 352: 64 65 78 74 32 63 64 74 32 05 43 52 45 41 54 45 dext2cdt2.CREATE + | 368: 20 49 4e 44 45 58 20 74 32 63 64 20 4f 4e 20 74 INDEX t2cd ON t + | 384: 32 28 63 2c 64 29 28 05 06 17 11 11 01 3d 74 61 2(c,d)(......=ta + | 400: 62 6c 65 74 33 74 33 04 43 52 45 41 54 45 20 54 blet3t3.CREATE T + | 416: 41 42 4c 45 20 74 33 28 63 2c 78 2c 65 2c 66 29 ABLE t3(c,x,e,f) + | 432: 28 02 06 17 11 11 01 3d 74 61 62 6c 65 74 32 74 (......=tablet2t + | 448: 32 03 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 2.CREATE TABLE t + | 464: 32 28 63 2c 64 2c 65 2c 66 29 24 01 06 17 11 11 2(c,d,e,f)$..... + | 480: 01 35 74 61 62 6c 65 74 31 74 31 02 43 52 45 41 .5tablet1t1.CREA + | 496: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 29 TE TABLE t1(a,b) + | page 2 offset 512 + | 0: 0d 00 00 00 04 01 cf 00 01 fa 01 f3 01 de 01 cf ................ + | 176: 10 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + | 256: 00 00 14 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ + | 368: 00 00 00 00 00 00 00 00 00 00 00 00 1e 00 00 00 ................ + | 416: 00 00 00 1b 00 00 00 00 04 00 00 00 00 00 00 00 ................ + | 448: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d ................ + | 464: 04 03 17 17 73 65 76 65 6e 65 69 67 68 74 13 03 ....seveneight.. + | 480: 03 07 07 40 14 00 00 00 00 00 00 40 18 00 00 00 ...@.......@.... + | 496: 00 00 00 05 02 03 01 01 03 04 04 01 03 09 01 02 ................ + | page 3 offset 1024 + | 0: 0d 00 00 00 08 01 54 00 01 f7 01 ec 01 c5 01 aa ......T......... + | 16: 01 a1 01 96 01 6f 01 54 00 00 00 00 00 00 00 00 .....o.T........ + | 32: 00 00 00 00 00 00 00 03 e8 00 00 00 00 00 00 00 ................ + | 336: 00 00 00 00 19 08 05 16 17 17 17 65 69 67 68 74 ...........eight + | 352: 65 69 67 68 74 73 65 76 65 6e 73 65 76 ff ff ff eightsevensev... + | 368: 0e 05 07 07 07 07 40 18 00 00 00 00 00 00 40 18 ......@.......@. + | 384: 00 00 00 00 00 00 40 14 00 00 00 00 00 00 40 14 ......@.......@. + | 400: 00 00 00 00 00 00 09 06 05 01 01 01 01 04 04 03 ................ + | 416: 03 07 05 05 01 01 09 09 02 02 19 04 05 17 17 17 ................ + | 432: 17 73 65 6f 65 6e 65 69 67 68 74 65 69 67 68 74 .seoeneighteight + | 448: 73 65 76 65 6e 25 03 05 07 07 07 07 40 14 00 00 seven%......@... + | 464: 00 00 00 00 40 18 00 00 00 00 00 00 40 18 00 00 ....@.......@... + | 480: 00 00 00 00 40 14 00 00 00 00 00 00 09 02 05 01 ....@........... + | 496: 01 01 01 03 04 04 03 07 01 05 09 01 01 09 02 02 ................ + | page 4 offset 1536 + | 0: 0d 00 00 00 00 00 10 00 00 00 00 00 00 00 00 00 ................ + | 160: 00 00 00 ea 00 00 00 00 00 00 00 00 00 00 00 00 ................ + | 336: 00 00 00 00 00 00 00 00 00 00 00 00 20 00 00 00 ............ ... + | page 5 offset 2048 + | 0: 0a 00 00 00 08 01 96 00 01 fa 01 c4 01 f2 01 bc ................ + | 16: 01 dc 01 a6 01 96 01 cc 00 00 00 00 00 00 00 00 ................ + | 48: 00 00 00 00 00 00 00 00 00 00 10 00 00 00 00 00 ................ + | 288: 00 00 00 00 00 00 00 00 00 64 00 00 00 2b 00 00 .........d...+.. + | 400: 00 00 00 00 00 00 0f 04 17 17 01 65 69 67 68 74 ...........eight + | 416: 65 69 6f 68 74 08 15 04 07 07 01 40 18 00 00 00 eioht......@.... + | 432: 00 00 00 40 18 00 00 00 00 00 00 07 07 04 01 01 ...@............ + | 448: 01 04 04 06 07 04 01 01 01 02 02 05 0f 04 17 17 ................ + | 464: 01 73 65 76 65 6e 65 69 67 68 74 04 15 04 07 07 .seveneight..... + | 480: 01 40 14 00 00 00 00 00 00 40 18 00 00 00 00 00 .@.......@...... + | 496: 00 03 07 04 01 01 01 03 04 02 05 04 09 01 09 02 ................ + | page 6 offset 2560 + | 0: 0a 00 00 00 00 02 00 00 00 00 00 00 00 0d 00 00 ................ + | 16: 00 08 01 c2 00 01 fb 01 f6 01 f1 01 ec 01 e0 01 ................ + | 32: d4 01 cb 01 c2 00 00 00 00 00 00 00 00 00 00 00 ................ + | 160: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 00 ................ + | 448: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 07 ................ + | 464: 08 02 17 65 69 67 68 74 07 07 02 17 65 69 67 68 ...eight....eigh + | 480: 74 0a 06 02 07 40 18 00 00 00 00 00 00 0a 05 02 t....@.......... + | 496: 07 40 18 00 04 02 01 04 03 03 02 01 04 03 02 02 .@.............. + | end x/c03.db + }] + catchsql {INSERT INTO t3 SELECT * FROM t2;} +} {1 {database disk image is malformed}} + + +do_test dbfuzz001-310 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 3584 pagesize 512 filename x/c02.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 02 00 01 01 00 40 20 20 00 00 00 0c 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 08 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 04 00 00 00 01 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0c ................ +| 96: 00 2e 2c 50 0d 00 00 00 06 01 06 00 01 da 01 b0 ..,P............ +| 112: 01 56 01 86 01 2a 01 06 00 00 00 00 00 00 00 00 .V...*.......... +| 256: 00 00 00 00 00 00 22 07 06 17 11 11 01 31 74 61 ......"......1ta +| 272: 62 6c 65 74 34 74 34 07 43 52 45 41 54 45 20 54 blet4t4.CREATE T +| 288: 41 42 4c 45 20 74 34 28 78 29 2a 06 06 17 13 11 ABLE t4(x)*..... +| 304: 01 3f 69 6e 64 65 78 74 33 78 74 33 05 43 52 45 .?indext3xt3.CRE +| 320: 41 54 45 20 49 4e 44 45 58 20 74 33 78 20 4f 4e ATE INDEX t3x ON +| 336: 20 74 33 28 78 29 2e 04 06 17 15 11 01 45 69 6e t3(x).......Ein +| 352: 64 65 78 74 32 63 64 74 32 05 43 52 45 41 54 45 dext2cdt2.CREATE +| 368: 20 49 4e 44 45 58 20 74 32 63 64 20 4f 4e 20 74 INDEX t2cd ON t +| 384: 32 28 63 2c 64 29 28 05 06 17 11 11 01 3d 74 61 2(c,d)(......=ta +| 400: 62 6c 65 74 33 74 33 07 43 52 45 41 54 45 20 54 blet3t3.CREATE T +| 416: 41 42 4c 45 20 74 33 28 63 2c 78 2c 65 2c 66 29 ABLE t3(c,x,e,f) +| 432: 28 02 06 17 11 11 01 3d 74 61 74 65 6c 03 62 74 (......=tatel.bt +| 448: 32 32 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 22CREATE TABLE t +| 464: 32 28 63 2c 64 2c 65 2c 66 29 24 01 06 17 11 11 2(c,d,e,f)$..... +| 480: 01 35 74 61 62 6c 65 74 31 74 31 02 43 52 45 41 .5tablet1t1.CREA +| 496: 54 45 20 54 41 42 4c 45 20 74 31 28 61 2c 62 29 TE TABLE t1(a,b) +| page 2 offset 512 +| 0: 0d 00 00 00 04 01 cf 00 01 fa 01 f3 01 de 01 cf ................ +| 160: 00 00 20 00 00 00 00 00 00 00 00 00 00 00 00 00 .. ............. +| 448: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0d ................ +| 464: 04 03 17 17 73 65 76 65 6e 65 69 67 68 74 13 03 ....seveneight.. +| 480: 03 07 07 40 14 00 00 00 00 00 00 40 18 00 00 00 ...@.......@.... +| 496: 00 00 00 05 02 03 01 01 03 04 04 01 03 09 01 02 ................ +| page 3 offset 1024 +| 0: 0d 00 00 00 08 01 54 00 01 f7 01 ec 01 c5 01 aa ......T......... +| 16: 01 a1 01 96 01 6f 01 54 00 00 00 00 00 00 00 00 .....o.T........ +| 112: 00 00 dd 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 336: 00 00 00 00 19 08 05 17 17 17 17 65 69 67 68 74 ...........eight +| 352: 65 69 67 68 74 73 65 76 65 6e 73 65 76 65 6e 25 eightsevenseven% +| 368: 07 05 07 07 07 07 40 18 00 00 00 00 00 00 40 18 ......@.......@. +| 384: 00 00 00 00 00 00 40 14 00 00 00 00 00 00 40 14 ......@.......@. +| 400: 00 00 00 00 00 00 09 06 05 01 01 01 01 04 04 03 ................ +| 416: 03 07 05 05 01 01 09 09 02 02 19 04 05 17 17 17 ................ +| 432: 17 73 65 76 65 6e 65 69 67 68 74 65 69 67 68 74 .seveneighteight +| 448: 73 65 76 65 6e 25 03 05 07 07 07 07 40 14 00 00 seven%......@... +| 464: 00 00 00 00 40 18 00 00 00 00 00 00 40 18 00 00 ....@.......@... +| 480: 00 00 00 00 40 14 00 00 00 00 00 00 09 02 05 01 ....@........... +| 496: 01 01 01 03 04 04 03 07 01 05 09 01 01 09 02 02 ................ +| page 4 offset 1536 +| 0: 0d 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 ................ +| 192: 00 00 00 00 00 00 7f 00 00 00 00 00 00 00 00 00 ................ +| 208: 00 e5 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 2048 +| 0: 0a 00 00 00 08 01 96 00 01 fa 01 c4 01 f2 01 bc ................ +| 16: 01 dc 01 a6 01 96 01 cc 00 00 00 00 00 00 00 00 ................ +| 240: 00 00 00 00 00 00 00 00 00 00 00 00 00 0e 00 00 ................ +| 400: 00 00 00 00 00 00 0f 04 17 07 01 65 69 67 68 74 ...........eight +| 416: 65 69 67 68 74 08 15 04 07 07 01 40 18 00 00 00 eight......@.... +| 432: 00 00 00 40 18 00 00 00 00 00 00 07 07 04 01 01 ...@............ +| 448: 01 04 04 06 07 04 01 01 01 02 02 05 0f 04 17 17 ................ +| 464: 01 73 65 76 65 6e 65 69 67 68 74 04 15 04 07 07 .seveneight..... +| 480: 01 40 14 00 00 00 00 00 00 40 18 00 00 00 00 00 .@.......@...... +| 496: 00 03 07 04 01 01 01 03 04 02 05 04 09 01 09 02 ................ +| page 6 offset 2560 +| 0: 0a 00 00 00 00 02 00 00 00 00 00 00 00 00 00 00 ................ +| 464: 00 00 00 00 00 00 00 00 00 00 7f 00 00 00 00 00 ................ +| page 7 offset 3072 +| 0: 0d 00 00 00 08 01 c2 00 01 fb 01 f6 01 f1 01 ec ................ +| 16: 01 e0 01 d4 01 cb 01 c2 00 00 00 00 00 00 00 00 ................ +| 448: 00 00 07 08 02 17 65 69 67 68 74 07 07 02 17 65 ......eight....e +| 464: 69 67 68 74 0a 06 02 07 40 18 00 00 00 00 00 00 ight....@....... +| 480: 0a 05 02 07 40 18 00 00 00 00 00 00 03 04 02 01 ....@........... +| 496: 04 03 03 02 01 04 03 02 02 01 02 03 01 02 01 02 ................ +| end x/c02.db + }] +} {} + +do_catchsql_test dbfuzz001-320 { + PRAGMA integrity_check; +} {1 {database disk image is malformed}} + +do_catchsql_test dbfuzz001-330 { + DELETE FROM t3 WHERE x IN (SELECT x FROM t4); +} {1 {database disk image is malformed}} + +finish_test diff --git a/test/dbfuzz2.c b/test/dbfuzz2.c index 0833f03..1649d42 100644 --- a/test/dbfuzz2.c +++ b/test/dbfuzz2.c @@ -43,6 +43,8 @@ #include #include #include +#include +#include #include "sqlite3.h" /* @@ -64,6 +66,95 @@ static const char *azSql[] = { /* Output verbosity level. 0 means complete silence */ int eVerbosity = 0; +/* True to activate PRAGMA vdbe_debug=on */ +static int bVdbeDebug = 0; + +/* Maximum size of the in-memory database file */ +static sqlite3_int64 szMax = 104857600; + +/***** Copy/paste from ext/misc/memtrace.c ***************************/ +/* The original memory allocation routines */ +static sqlite3_mem_methods memtraceBase; +static FILE *memtraceOut; + +/* Methods that trace memory allocations */ +static void *memtraceMalloc(int n){ + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: allocate %d bytes\n", + memtraceBase.xRoundup(n)); + } + return memtraceBase.xMalloc(n); +} +static void memtraceFree(void *p){ + if( p==0 ) return; + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: free %d bytes\n", memtraceBase.xSize(p)); + } + memtraceBase.xFree(p); +} +static void *memtraceRealloc(void *p, int n){ + if( p==0 ) return memtraceMalloc(n); + if( n==0 ){ + memtraceFree(p); + return 0; + } + if( memtraceOut ){ + fprintf(memtraceOut, "MEMTRACE: resize %d -> %d bytes\n", + memtraceBase.xSize(p), memtraceBase.xRoundup(n)); + } + return memtraceBase.xRealloc(p, n); +} +static int memtraceSize(void *p){ + return memtraceBase.xSize(p); +} +static int memtraceRoundup(int n){ + return memtraceBase.xRoundup(n); +} +static int memtraceInit(void *p){ + return memtraceBase.xInit(p); +} +static void memtraceShutdown(void *p){ + memtraceBase.xShutdown(p); +} + +/* The substitute memory allocator */ +static sqlite3_mem_methods ersaztMethods = { + memtraceMalloc, + memtraceFree, + memtraceRealloc, + memtraceSize, + memtraceRoundup, + memtraceInit, + memtraceShutdown +}; + +/* Begin tracing memory allocations to out. */ +int sqlite3MemTraceActivate(FILE *out){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc==0 ){ + rc = sqlite3_config(SQLITE_CONFIG_GETMALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &ersaztMethods); + } + } + memtraceOut = out; + return rc; +} + +/* Deactivate memory tracing */ +int sqlite3MemTraceDeactivate(void){ + int rc = SQLITE_OK; + if( memtraceBase.xMalloc!=0 ){ + rc = sqlite3_config(SQLITE_CONFIG_MALLOC, &memtraceBase); + if( rc==SQLITE_OK ){ + memset(&memtraceBase, 0, sizeof(memtraceBase)); + } + } + memtraceOut = 0; + return rc; +} +/***** End copy/paste from ext/misc/memtrace.c ***************************/ + /* libFuzzer invokes this routine with fuzzed database files (in aData). ** This routine run SQLite against the malformed database to see if it ** can provoke a failure or malfunction. @@ -73,11 +164,14 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ sqlite3 *db; int rc; int i; + sqlite3_int64 x; + char *zErr = 0; if( eVerbosity>=1 ){ printf("************** nByte=%d ***************\n", (int)nByte); fflush(stdout); } + if( sqlite3_initialize() ) return 0; rc = sqlite3_open(0, &db); if( rc ) return 1; a = sqlite3_malloc64(nByte+1); @@ -86,12 +180,22 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ sqlite3_deserialize(db, "main", a, nByte, nByte, SQLITE_DESERIALIZE_RESIZEABLE | SQLITE_DESERIALIZE_FREEONCLOSE); + x = szMax; + sqlite3_file_control(db, "main", SQLITE_FCNTL_SIZE_LIMIT, &x); + if( bVdbeDebug ){ + sqlite3_exec(db, "PRAGMA vdbe_debug=ON", 0, 0, 0); + } for(i=0; i=1 ){ printf("%s\n", azSql[i]); fflush(stdout); } - sqlite3_exec(db, azSql[i], 0, 0, 0); + zErr = 0; + rc = sqlite3_exec(db, azSql[i], 0, 0, &zErr); + if( rc && eVerbosity>=1 ){ + printf("-- rc=%d zErr=%s\n", rc, zErr); + } + sqlite3_free(zErr); } rc = sqlite3_close(db); if( rc!=SQLITE_OK ){ @@ -108,31 +212,142 @@ int LLVMFuzzerTestOneInput(const uint8_t *aData, size_t nByte){ return 0; } +/* +** Return the number of "v" characters in a string. Return 0 if there +** are any characters in the string other than "v". +*/ +static int numberOfVChar(const char *z){ + int N = 0; + while( z[0] && z[0]=='v' ){ + z++; + N++; + } + return z[0]==0 ? N : 0; +} + /* libFuzzer invokes this routine once when the executable starts, to ** process the command-line arguments. */ int LLVMFuzzerInitialize(int *pArgc, char ***pArgv){ - int i, j; + int i, j, n; int argc = *pArgc; - char **newArgv; char **argv = *pArgv; - newArgv = malloc( sizeof(char*)*(argc+1) ); - if( newArgv==0 ) return 0; - newArgv[0] = argv[0]; for(i=j=1; i0 ){ + eVerbosity += n; + continue; + } + if( strcmp(z,"vdbe-debug")==0 ){ + bVdbeDebug = 1; + continue; + } + if( strcmp(z,"memtrace")==0 ){ + sqlite3MemTraceActivate(stdout); + continue; + } + if( strcmp(z,"mem")==0 ){ + bVdbeDebug = 1; + continue; + } + if( strcmp(z,"max-db-size")==0 ){ + if( i+1==argc ){ + fprintf(stderr, "missing argument to %s\n", argv[i]); + exit(1); + } + szMax = strtol(argv[++i], 0, 0); + continue; + } + if( strcmp(z,"max-stack")==0 + || strcmp(z,"max-data")==0 + || strcmp(z,"max-as")==0 + ){ + struct rlimit x,y; + int resource = RLIMIT_STACK; + char *zType = "RLIMIT_STACK"; + if( i+1==argc ){ + fprintf(stderr, "missing argument to %s\n", argv[i]); + exit(1); + } + if( z[4]=='d' ){ + resource = RLIMIT_DATA; + zType = "RLIMIT_DATA"; + } + if( z[4]=='a' ){ + resource = RLIMIT_AS; + zType = "RLIMIT_AS"; + } + memset(&x,0,sizeof(x)); + getrlimit(resource, &x); + y.rlim_cur = atoi(argv[++i]); + y.rlim_max = x.rlim_cur; + setrlimit(resource, &y); + memset(&y,0,sizeof(y)); + getrlimit(resource, &y); + printf("%s changed from %d to %d\n", + zType, (int)x.rlim_cur, (int)y.rlim_cur); continue; } } - newArgv[j++] = argv[i]; + argv[j++] = argv[i]; } - newArgv[j] = 0; - *pArgv = newArgv; + argv[j] = 0; *pArgc = j; return 0; } + +#ifdef STANDALONE +/* +** Read an entire file into memory. Space to hold the file comes +** from malloc(). +*/ +static unsigned char *readFile(const char *zName, int *pnByte){ + FILE *in = fopen(zName, "rb"); + long nIn; + size_t nRead; + unsigned char *pBuf; + if( in==0 ) return 0; + fseek(in, 0, SEEK_END); + nIn = ftell(in); + rewind(in); + pBuf = malloc( nIn+1 ); + if( pBuf==0 ){ fclose(in); return 0; } + nRead = fread(pBuf, nIn, 1, in); + fclose(in); + if( nRead!=1 ){ + free(pBuf); + return 0; + } + pBuf[nIn] = 0; + if( pnByte ) *pnByte = nIn; + return pBuf; +} +#endif /* STANDALONE */ + +#ifdef STANDALONE +int main(int argc, char **argv){ + int i; + LLVMFuzzerInitialize(&argc, &argv); + for(i=1; i0 ){ + struct rusage x; + printf("SQLite %s\n", sqlite3_sourceid()); + memset(&x, 0, sizeof(x)); + if( getrusage(RUSAGE_SELF, &x)==0 ){ + printf("Maximum RSS = %ld KB\n", x.ru_maxrss); + } + } + return 0; +} +#endif /*STANDALONE*/ diff --git a/test/e_select.test b/test/e_select.test index 5916e94..c2fdc9a 100644 --- a/test/e_select.test +++ b/test/e_select.test @@ -167,7 +167,7 @@ do_select_tests e_select-0.2 { 0102.1 "SELECT count(*), max(a) FROM t1 GROUP BY b HAVING count(*)=1" { 1 a 1 c 1 b } - 0102.2 "SELECT count(*), max(a) FROM t1 GROUP BY b HAVING count(*)=2" { } + 0102.2 "SELECT count(*), max(a) FROM t1 GROUP BY b HAVING count(*)=2" {} 1101.1 "SELECT DISTINCT count(*), max(a) FROM t1 GROUP BY b" {1 a 1 c 1 b} 1102.1 "SELECT DISTINCT count(*), max(a) FROM t1 @@ -175,8 +175,7 @@ do_select_tests e_select-0.2 { 1 a 1 c 1 b } 1102.2 "SELECT DISTINCT count(*), max(a) FROM t1 - GROUP BY b HAVING count(*)=2" { - } + GROUP BY b HAVING count(*)=2" {} 2101.1 "SELECT ALL count(*), max(a) FROM t1 GROUP BY b" {1 a 1 c 1 b} 2102.1 "SELECT ALL count(*), max(a) FROM t1 @@ -184,8 +183,7 @@ do_select_tests e_select-0.2 { 1 a 1 c 1 b } 2102.2 "SELECT ALL count(*), max(a) FROM t1 - GROUP BY b HAVING count(*)=2" { - } + GROUP BY b HAVING count(*)=2" {} 0011.1 "SELECT 1, 2, 3 WHERE 1 GROUP BY 2" {1 2 3} 0012.1 "SELECT 1, 2, 3 WHERE 0 GROUP BY 2 HAVING count(*)=1" {} @@ -204,7 +202,7 @@ do_select_tests e_select-0.2 { 0112.1 "SELECT count(*), max(a) FROM t1 WHERE a='c' GROUP BY b HAVING count(*)=1" {1 c} 0112.2 "SELECT count(*), max(a) FROM t1 - WHERE 0 GROUP BY b HAVING count(*)=2" { } + WHERE 0 GROUP BY b HAVING count(*)=2" {} 1111.1 "SELECT DISTINCT count(*), max(a) FROM t1 WHERE a<'c' GROUP BY b" {1 a 1 b} 1112.1 "SELECT DISTINCT count(*), max(a) FROM t1 WHERE a>'a' @@ -212,8 +210,7 @@ do_select_tests e_select-0.2 { 1 c 1 b } 1112.2 "SELECT DISTINCT count(*), max(a) FROM t1 WHERE 0 - GROUP BY b HAVING count(*)=2" { - } + GROUP BY b HAVING count(*)=2" {} 2111.1 "SELECT ALL count(*), max(a) FROM t1 WHERE b>'one' GROUP BY b" {1 c 1 b} @@ -222,7 +219,7 @@ do_select_tests e_select-0.2 { 1 a 1 c } 2112.2 "SELECT ALL count(*), max(a) FROM t1 - WHERE 0 GROUP BY b HAVING count(*)=2" { } + WHERE 0 GROUP BY b HAVING count(*)=2" {} } diff --git a/test/eqp.test b/test/eqp.test index 3de746e..f931f8f 100644 --- a/test/eqp.test +++ b/test/eqp.test @@ -45,8 +45,10 @@ do_eqp_test 1.2 { } { QUERY PLAN |--MULTI-INDEX OR - | |--SEARCH TABLE t1 USING INDEX i1 (a=?) - | `--SEARCH TABLE t1 USING INDEX i2 (b=?) + | |--INDEX 1 + | | `--SEARCH TABLE t1 USING INDEX i1 (a=?) + | `--INDEX 2 + | `--SEARCH TABLE t1 USING INDEX i2 (b=?) `--SCAN TABLE t2 } do_eqp_test 1.3 { @@ -55,8 +57,10 @@ do_eqp_test 1.3 { QUERY PLAN |--SCAN TABLE t2 `--MULTI-INDEX OR - |--SEARCH TABLE t1 USING INDEX i1 (a=?) - `--SEARCH TABLE t1 USING INDEX i2 (b=?) + |--INDEX 1 + | `--SEARCH TABLE t1 USING INDEX i1 (a=?) + `--INDEX 2 + `--SEARCH TABLE t1 USING INDEX i2 (b=?) } do_eqp_test 1.3 { SELECT a FROM t1 ORDER BY a @@ -225,7 +229,7 @@ do_eqp_test 3.1.1 { } { QUERY PLAN |--SCAN TABLE t1 - `--SCALAR SUBQUERY + `--SCALAR SUBQUERY xxxxxx `--SCAN TABLE t1 AS sub } do_eqp_test 3.1.2 { @@ -233,7 +237,7 @@ do_eqp_test 3.1.2 { } { QUERY PLAN |--SCAN TABLE t1 - `--SCALAR SUBQUERY + `--SCALAR SUBQUERY xxxxxx `--SCAN TABLE t1 AS sub } do_eqp_test 3.1.3 { @@ -241,7 +245,7 @@ do_eqp_test 3.1.3 { } { QUERY PLAN |--SCAN TABLE t1 - `--SCALAR SUBQUERY + `--SCALAR SUBQUERY xxxxxx |--SCAN TABLE t1 AS sub `--USE TEMP B-TREE FOR ORDER BY } @@ -250,7 +254,7 @@ do_eqp_test 3.1.4 { } { QUERY PLAN |--SCAN TABLE t1 - `--SCALAR SUBQUERY + `--SCALAR SUBQUERY xxxxxx `--SCAN TABLE t2 USING COVERING INDEX t2i1 } @@ -286,7 +290,7 @@ det 3.3.1 { } { QUERY PLAN |--SCAN TABLE t1 - `--LIST SUBQUERY + `--LIST SUBQUERY xxxxxx `--SCAN TABLE t2 } det 3.3.2 { @@ -294,7 +298,7 @@ det 3.3.2 { } { QUERY PLAN |--SCAN TABLE t1 - `--CORRELATED LIST SUBQUERY + `--CORRELATED LIST SUBQUERY xxxxxx `--SCAN TABLE t2 } det 3.3.3 { @@ -302,7 +306,7 @@ det 3.3.3 { } { QUERY PLAN |--SCAN TABLE t1 - `--CORRELATED SCALAR SUBQUERY + `--CORRELATED SCALAR SUBQUERY xxxxxx `--SCAN TABLE t2 } @@ -813,7 +817,7 @@ do_eqp_test 9.1 { |--MATERIALIZE xxxxxx | |--SCAN TABLE forumpost AS x USING INDEX forumthread | |--USING ROWID SEARCH ON TABLE private FOR IN-OPERATOR - | |--CORRELATED SCALAR SUBQUERY + | |--CORRELATED SCALAR SUBQUERY xxxxxx | | |--SEARCH TABLE forumpost USING COVERING INDEX forumthread (froot=?) | | `--USING ROWID SEARCH ON TABLE private FOR IN-OPERATOR | `--USE TEMP B-TREE FOR ORDER BY diff --git a/test/fallocate.test b/test/fallocate.test index 0c971c0..3e15448 100644 --- a/test/fallocate.test +++ b/test/fallocate.test @@ -70,6 +70,15 @@ do_test fallocate-1.7 { } {1024} do_test fallocate-1.8 { execsql { COMMIT } } {} +do_test fallocate-1.8 { + set nPg [db one {PRAGMA page_count}] + set nFile [expr [file size test.db] / 1024] + list [expr $nPg<100] [expr $nFile>100] +} {1 1} + +do_execsql_test fallocate-1.9 { + PRAGMA max_page_count = 100; +} {100} #------------------------------------------------------------------------- # The following tests - fallocate-2.* - test that things work in WAL diff --git a/test/fkey8.test b/test/fkey8.test index 4269c20..f38e835 100644 --- a/test/fkey8.test +++ b/test/fkey8.test @@ -164,4 +164,38 @@ do_catchsql_test 2.3.1 { DELETE FROM p3 WHERE a=1 } {1 {FOREIGN KEY constraint failed}} + +do_execsql_test 3.0 { + PRAGMA foreign_keys=ON; + CREATE TABLE t2( + a PRIMARY KEY, b, c, d, e, + FOREIGN KEY(b, c) REFERENCES t2(d, e) + ) WITHOUT ROWID; + CREATE UNIQUE INDEX idx ON t2(d, e); + + INSERT INTO t2 VALUES(1, 'one', 'one', 'one', 'one'); -- row is parent of self + INSERT INTO t2 VALUES(2, 'one', 'one', 'one', NULL); -- parent is row 1 +} + +do_catchsql_test 3.1 { + DELETE FROM t2 WHERE a=1; +} {1 {FOREIGN KEY constraint failed}} + +do_execsql_test 4.0 { + CREATE TABLE t1 ( + c1 PRIMARY KEY, + c2 NUMERIC, + FOREIGN KEY(c1) REFERENCES t1(c2) + ) WITHOUT ROWID ; + CREATE INDEX t1c1 ON t1(c1); + CREATE UNIQUE INDEX t1c1unique ON t1(c2); +} +do_catchsql_test 4.1 { + INSERT OR REPLACE INTO t1 VALUES(10000, 20000); +} {1 {FOREIGN KEY constraint failed}} +do_execsql_test 4.2 { + INSERT OR REPLACE INTO t1 VALUES(20000, 20000); +} + finish_test + diff --git a/test/fts3_common.tcl b/test/fts3_common.tcl index 2ed1f70..fcd3ca3 100644 --- a/test/fts3_common.tcl +++ b/test/fts3_common.tcl @@ -44,6 +44,10 @@ # # +ifcapable fts3 { + sqlite3_fts3_may_be_corrupt 0 +} + #------------------------------------------------------------------------- # USAGE: fts3_build_db_1 SWITCHES N # diff --git a/test/fts3aa.test b/test/fts3aa.test index d5f96d8..cb1bde7 100644 --- a/test/fts3aa.test +++ b/test/fts3aa.test @@ -250,5 +250,16 @@ do_execsql_test 9.2 { CREATE VIRTUAL TABLE t10 USING fts3(<, b, c); } +do_execsql_test 10.0 { + CREATE VIRTUAL TABLE z1 USING fts3; + INSERT INTO z1 VALUES('one two three'),('four one five'),('six two five'); + CREATE TRIGGER z1r1 AFTER DELETE ON z1_content BEGIN + DELETE FROM z1; + END; +} +do_catchsql_test 10.1 { + DELETE FROM z1; +} {1 {SQL logic error}} + expand_all_sql db finish_test diff --git a/test/fts3aux2.test b/test/fts3aux2.test index e108fc4..9554022 100644 --- a/test/fts3aux2.test +++ b/test/fts3aux2.test @@ -141,4 +141,28 @@ do_execsql_test 1.4.6 { five * 1 1 2 five 0 1 1 2 } +#------------------------------------------------------------------------- +do_execsql_test 2.0 { + CREATE VIRTUAL TABLE ft USING fts3(); + INSERT INTO ft VALUES('a_234567890123456789'); + INSERT INTO ft VALUES('b_234567890123456789'); + INSERT INTO ft VALUES('c_234567890123456789'); + CREATE VIRTUAL TABLE t2 USING fts4aux(ft); +} + +do_execsql_test 2.1 { + SELECT term FROM t2 WHERE term=X'625f323334353637383930313233343536373839'; +} + +do_execsql_test 2.2 { + SELECT term FROM t2 WHERE term0 665..ad..... +| 3440: 08 69 70 69 73 63 69 6e 67 03 01 08 00 01 05 6c .ipiscing......l +| 3456: 69 71 75 61 03 02 0c 00 05 02 69 70 03 04 04 00 iqua......ip.... +| 3472: 01 03 6d 65 74 03 01 06 00 01 03 6e 69 6d 03 08 ..met......nim.. +| 3488: 09 00 01 03 75 74 65 03 05 03 00 00 06 63 69 6c ....ute......cil +| 3504: 6c 75 6d 03 06 02 00 01 06 6f 6d 6d 6f 64 6f 03 lum......ommodo. +| 3520: 04 07 00 02 09 6e 73 65 63 74 65 74 75 72 03 01 .....nsectetur.. +| 3536: 07 00 05 04 71 75 61 74 03 04 08 00 01 04 75 6c ....quat......ul +| 3552: 70 61 03 08 04 00 02 07 70 69 64 61 74 61 74 03 pa......pidatat. +| 3568: 07 05 00 00 08 64 65 73 65 72 75 6e 74 03 08 07 .....deserunt... +| 3584: 00 01 01 6f 03 02 03 00 02 03 6c 6f 72 06 01 04 ...o......lor... +| 3600: 00 04 05 00 05 01 65 06 02 0a 00 04 03 00 01 03 ......e......... +| 3616: 75 69 73 03 05 02 00 00 02 65 61 03 04 06 00 01 uis......ea..... +| 3632: 06 69 75 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 .iusmod......lit +| 3648: 03 01 09 00 01 03 6e 69 6d 03 03 03 00 01 03 73 ......nim......s +| 3664: 73 65 03 05 0b 00 02 01 74 03 08 0b 00 01 01 74 se......t......t +| 3680: 03 02 09 00 01 01 75 03 06 04 00 01 01 78 03 04 ......u......x.. +| 3696: 05 00 02 07 63 65 70 74 65 75 72 03 07 02 00 02 ....cepteur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 6e 74 03 02 06 00 01 04 70 73 cididunt......ps +| 3776: 75 6d 03 01 03 00 01 04 72 75 72 65 03 05 04 00 um......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 05 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 70 72 65 68 65 6e 64 65 72 69 ....reprehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 02 00 01 03 t......sed...... +| 4000: 69 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 int......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 6f 6c 75 70 74 61 74 65 03 05 09 00 ....oluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 02 08 01 04 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0e 0a 04 02 03 00 0e 0b 04 01 03 00 0e 08 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 00 03 00 14 08 45 b5 03 .............E.. +| page 8 offset 28672 +| 0: 6f ee cd e1 f1 ee 1a ca be ed ee ec de ac f1 cb o............... +| 16: f1 ee 1a ce de ee f1 ee 0a cc de ed ae 90 87 88 ................ +| 32: ec 5e dc ec fc 11 72 32 75 0a da be ec ed eb de .^....r2u....... +| 48: ce c1 aa e0 ae ec 1f c1 ee 99 c2 aa e0 a9 ad 15 ................ +| 64: 0e ec ab ef 1e e0 48 ad 15 04 24 80 00 00 00 00 ......H...$..... +| 80: 00 00 00 00 e0 00 00 00 04 2c 80 00 10 42 4e c1 .........,...BN. +| 96: 20 4b 45 59 2c 6e 6f 64 65 6e 6f 2c 61 30 29 46 KEY,nodeno,a0)F +| 112: 02 06 17 11 11 08 7b 74 61 62 6c 65 74 31 74 31 .......tablet1t1 +| 128: 43 52 45 41 54 e1 ec eb ea eb eb ac ee ce be de CREAT........... +| 144: ee f1 ee 1a ca ba de 47 80 30 00 14 90 47 70 30 .......G.0...Gp0 +| 160: 00 11 60 47 60 30 00 15 f0 47 50 30 00 10 f0 47 ..`G`0...GP0...G +| 176: 40 30 00 11 f0 47 45 20 30 00 11 d0 45 10 30 00 @0...GE 0...E.0. +| 192: 12 10 45 00 30 00 14 e0 44 f0 30 00 11 e0 44 e0 ..E.0...D.0...D. +| 208: 30 00 12 a0 44 d0 30 00 15 e0 44 c0 30 00 10 40 0...D.0...D.0..@ +| 224: 44 b0 30 00 15 10 44 a0 30 00 14 c0 44 90 30 00 D.0...D.0...D.0. +| 240: 16 20 44 80 30 00 52 45 41 54 45 20 54 41 42 4c . D.0.REATE TABL +| 256: 45 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 69 E 't1_content'(i +| 272: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 288: 59 20 4b 45 59 2c 20 63 30 29 69 03 07 17 19 19 Y KEY, c0)i..... +| 304: 01 81 2d 74 61 62 6c 65 74 31 5f 69 64 78 74 31 ..-tablet1_idxt1 +| 320: 5f 69 64 78 03 43 52 45 41 54 45 20 54 41 42 4c _idx.CREATE TABL +| 336: 45 20 27 70 31 5f 69 64 78 03 6e 69 6d 03 03 03 E 'p1_idx.nim... +| 352: 00 01 03 73 73 65 03 05 0b 00 02 01 74 03 08 0b ...sse......t... +| 368: 00 01 01 74 03 02 09 00 01 01 75 03 06 04 00 01 ...t......u..... +| 384: 01 78 03 04 05 00 02 07 63 65 70 74 65 75 72 03 .x......cepteur. +| 400: 07 02 00 02 0a 65 72 63 69 74 61 74 69 6f 6e 03 .....ercitation. +| 416: 03 09 00 00 06 66 75 67 69 61 74 03 06 05 00 00 .....fugiat..... +| 432: 02 69 64 03 08 0a 00 01 01 6e 07 05 06 04 00 03 .id......n...... +| 448: 03 00 02 08 63 69 64 69 64 75 6e 74 03 02 06 00 ....cididunt.... +| 464: 01 04 70 73 75 6d 03 01 03 00 01 04 72 75 72 65 ..psum......rure +| 480: 03 05 04 00 00 06 6c 61 62 6f 72 65 03 02 08 00 ......labore.... +| 496: 05 02 69 73 03 03 0b 00 05 02 75 6d 03 08 0c 00 ..is......um.... +| 512: 01 04 6f 72 65 6d 03 01 02 00 00 05 6d 61 67 6e ..orem......magn +| 528: 61 03 02 0b 00 01 04 69 6e 69 6d 03 03 05 00 01 a......inim..... +| 544: 05 6f 6c 6c 69 74 03 08 08 00 00 04 6e 69 73 69 .ollit......nisi +| 560: 03 04 02 00 01 02 6f 6e 03 07 06 00 02 05 73 74 ......on......st +| 576: 72 75 64 03 03 08 00 01 04 75 6c 6c 61 03 06 06 rud......ulla... +| 592: 00 00 08 6f 63 63 61 65 63 61 74 03 07 04 00 01 ...occaecat..... +| 608: 06 66 66 69 63 69 61 03 08 06 00 00 08 70 61 72 .fficia......par +| 624: 69 61 74 75 72 03 06 07 00 01 07 72 6f ed ce de iatur......ro... +| 640: 69 64 65 6e 74 03 07 07 00 00 03 71 75 69 03 08 ident......qui.. +| 656: 05 00 03 01 73 03 03 07 00 00 0d 72 65 70 72 65 ....s......repre +| 672: 68 65 6e 64 65 72 69 74 03 05 07 00 00 03 73 65 henderit......se +| 688: 64 03 02 02 00 01 03 69 6e 74 03 07 03 00 02 01 d......int...... +| 704: 74 03 01 05 00 01 03 75 6e 74 03 08 02 00 00 06 t......unt...... +| 720: 74 65 6d 70 6f 72 03 02 05 00 00 07 75 6c 6c 61 tempor......ulla +| 736: 6d 63 6f 03 03 0a 00 01 01 74 09 02 07 00 01 02 mco......t...... +| 752: 00 01 03 00 00 05 76 65 6c 69 74 03 05 0a 00 02 ......velit..... +| 768: 04 6e 69 61 6d 03 03 06 00 01 08 6f 6c 75 70 74 .niam......olupt +| 784: 61 74 65 03 05 09 00 0a 00 00 00 03 0f eb 00 0f ate............. +| 800: fb 0f f3 0f eb 00 00 00 00 00 00 00 00 00 00 00 ................ +| end crash-04bb6e7c811ce9.db +}]} {} + +do_catchsql_test 7.1 { + SELECT matchinfo(t1,'y') FROM t1 WHERE t1 MATCH 'e*'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 8.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-7948058d822acb.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e ef 00 07 0d 4d 00 0f bd 0f 5f ..........M...._ +| 112: 0e f7 0e 06 0e bc 0d a4 0d 4d 00 00 00 00 00 00 .........M...... +| 3392: 00 00 00 00 00 00 00 00 00 00 00 00 00 55 07 07 .............U.. +| 3408: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 73 74 ......tablet1_st +| 3424: 61 74 74 31 5f 73 74 61 74 07 43 52 45 41 54 45 att1_stat.CREATE +| 3440: 20 54 41 42 4c 45 20 27 74 31 5f 73 74 61 74 27 TABLE 't1_stat' +| 3456: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3472: 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 ARY KEY, value B +| 3488: 4c 4f 42 29 60 06 07 17 21 21 01 81 0b 74 61 62 LOB)`...!!...tab +| 3504: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3520: 6f 63 73 69 7a 65 06 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3536: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3552: 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 (docid INTEGER P +| 3568: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65 RIMARY KEY, size +| 3584: 20 42 4c 4f 42 29 81 33 04 07 17 1f 1f 01 82 35 BLOB).3.......5 +| 3600: 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 74 31 tablet1_segdirt1 +| 3616: 5f 73 65 67 64 69 72 04 43 52 45 41 54 45 20 54 _segdir.CREATE T +| 3632: 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 72 27 ABLE 't1_segdir' +| 3648: 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 (level INTEGER,i +| 3664: 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 72 74 dx INTEGER,start +| 3680: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c _block INTEGER,l +| 3696: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 eaves_end_block +| 3712: 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 INTEGER,end_bloc +| 3728: 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 k INTEGER,root B +| 3744: 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 LOB,PRIMARY KEY( +| 3760: 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 05 06 17 level, idx))1... +| 3776: 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 65 5f E...indexsqlite_ +| 3792: 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 65 67 autoindex_t1_seg +| 3808: 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 05 00 dir_1t1_segdir.. +| 3824: 00 00 08 00 00 00 00 66 03 07 17 23 23 01 81 13 .......f...##... +| 3840: 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e 74 73 tablet1_segments +| 3856: 74 31 5f 73 65 67 6d 65 6e 74 73 03 43 52 45 41 t1_segments.CREA +| 3872: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 TE TABLE 't1_seg +| 3888: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 ments'(blockid I +| 3904: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K +| 3920: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c EY, block BLOB). +| 3936: 02 07 17 21 21 01 81 03 74 61 62 6c 65 74 31 5f ...!!...tablet1_ +| 3952: 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 65 6e contentt1_conten +| 3968: 74 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 t.CREATE TABLE ' +| 3984: 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 t1_content'(doci +| 4000: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 4016: 59 20 4b 45 59 2c 20 27 63 30 61 27 29 41 01 06 Y KEY, 'c0a')A.. +| 4032: 17 11 11 08 71 74 61 62 6c 65 74 31 74 31 43 52 ....qtablet1t1CR +| 4048: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4064: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34 LE t1 USING fts4 +| 4080: 28 61 2c 70 72 65 66 69 78 3d 27 31 2c 32 27 29 (a,prefix='1,2') +| page 2 offset 4096 +| 0: 0d 00 00 00 08 0e 1f 00 0f c4 0f 7c 0f 34 0f 07 ...........|.4.. +| 16: 0e c3 0e 97 0e 63 0e 1f 00 00 00 00 00 00 00 00 .....c.......... +| 3600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +| 3616: 08 04 00 81 09 73 75 6e 74 20 69 6e 20 63 75 6c .....sunt in cul +| 3632: 70 61 20 71 75 69 20 6f 66 66 69 63 69 61 20 64 pa qui officia d +| 3648: 65 73 65 72 75 6e 74 20 6d 6f 6c 6c 69 74 20 61 eserunt mollit a +| 3664: 6e 69 6d 20 69 64 20 65 73 74 20 6c 61 62 6f 72 nim id est labor +| 3680: 75 6d 2e 32 07 03 00 6b 45 78 63 65 70 74 65 75 um.2...kExcepteu +| 3696: 72 20 73 69 6e 74 20 6f 63 63 61 65 63 67 42 06 r sint occaecgB. +| 3712: 37 57 06 96 46 17 46 17 42 06 e6 f6 e2 07 07 26 7W..F.F.B......& +| 3728: f6 96 46 56 e7 42 c2 a0 60 30 05 b6 36 96 c6 c7 ..FV.B..`0..6... +| 3744: 56 d2 06 46 f6 c6 f7 26 52 06 57 52 06 67 56 7c V..F...&R.WR.gV| +| 3760: 65 3f 04 20 6e 75 6c 6c 61 20 70 61 72 69 61 74 e?. nulla pariat +| 3776: 75 72 2e 42 05 04 00 81 09 44 75 69 73 20 61 75 ur.B.....Duis au +| 3792: 74 65 20 69 72 75 72 65 20 64 6f 6c 6f 72 20 69 te irure dolor i +| 3808: 6e 20 72 65 70 72 65 68 65 6e 64 65 72 69 74 20 n reprehenderit +| 3824: 69 6e 20 76 6f 6c 75 70 74 61 74 65 20 76 65 6c in voluptate vel +| 3840: 69 74 20 65 73 73 65 2b 04 03 00 5d 6e 69 73 69 it esse+...]nisi +| 3856: 20 75 74 20 61 7c 69 71 75 69 70 20 65 78 20 65 ut a|iquip ex e +| 3872: 61 20 63 6f 6d 6d 6f 64 6f 20 63 6f 6e 73 65 71 a commodo conseq +| 3888: 75 61 74 2e 46 03 04 00 81 11 55 74 20 65 6e 69 uat.F.....Ut eni +| 3904: 6d 20 61 64 20 6d 69 6e 69 6d 20 76 65 6e 69 61 m ad minim venia +| 3920: 6d 2c 20 71 75 69 73 20 6e 6f 73 74 72 75 64 20 m, quis nostrud +| 3936: 65 78 65 72 63 69 74 61 74 69 6f 6e 20 75 6c 6c exercitation ull +| 3952: 61 6d 63 6f 20 6c 61 62 6f 72 69 73 46 02 04 00 amco laborisF... +| 3968: 81 11 73 65 64 20 64 6f 20 65 69 75 73 6d 6f 64 ..sed do eiusmod +| 3984: 20 74 65 6d 70 6f 72 20 69 6e 63 69 64 69 64 75 tempor incididu +| 4000: 6e 74 20 75 74 20 6c 61 62 6f 72 65 20 65 74 20 nt ut labore et +| 4016: 64 6f 6c 6f 72 65 20 6d 61 67 6e 61 20 61 6c 69 dolore magna ali +| 4032: 71 75 61 2e 3a 01 03 00 7b 4c 6f 72 65 6d 20 69 qua.:....Lorem i +| 4048: 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 psum dolor sit a +| 4064: 6d 65 74 2c 20 63 6f 6e 73 65 63 74 65 74 75 72 met, consectetur +| 4080: 20 61 64 69 70 69 73 63 69 6e 67 20 65 6c 69 74 adipiscing elit +| page 3 offset 8192 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0a a6 00 0d 57 0c 4a 0a a6 00 00 .........W.J.... +| 2720: 00 00 00 00 00 00 83 21 03 08 02 08 08 08 17 86 .......!........ +| 2736: 30 08 00 30 20 34 30 32 00 02 61 64 06 01 08 00 0..0 402..ad.... +| 2752: 02 04 00 01 01 6c 06 02 0c 00 02 04 00 01 01 6d .....l.........m +| 2768: 03 01 06 00 01 01 6e 03 08 00 00 91 01 75 03 05 ......n......u.. +| 2784: 03 00 00 02 63 69 03 06 02 00 01 01 6f 07 01 07 ....ci......o... +| 2800: 00 03 07 03 00 01 01 75 06 07 05 00 01 04 00 00 .......u........ +| 2816: 02 64 65 03 08 07 00 01 01 6f 0d 01 04 00 01 03 .de......o...... +| 2832: 09 00 03 05 00 01 03 00 01 01 75 03 05 02 00 00 ..........u..... +| 2848: 02 65 61 03 04 06 00 01 01 69 03 02 04 00 01 01 .ea......i...... +| 2864: 6c 03 01 09 00 01 01 6e 30 03 03 00 01 01 73 06 l......n0.....s. +| 2880: 05 0b 00 03 0b 00 01 01 74 03 02 09 00 01 01 75 ........t......u +| 2896: 03 06 04 00 01 01 78 09 03 09 00 01 05 00 03 02 ......x......... +| 2912: 00 00 02 66 75 03 06 05 00 00 02 69 64 03 08 0a ...fu......id... +| 2928: 00 01 01 6e 0a 02 06 00 03 06 04 00 03 03 00 01 ...n............ +| 2944: 01 70 03 01 03 00 01 01 72 03 05 04 00 00 02 6c .p......r......l +| 2960: 61 09 02 08 00 01 0b 00 05 0c 00 01 01 6f 03 01 a............o.. +| 2976: 02 00 00 02 6d 61 03 02 0b 00 01 01 69 03 03 05 ....ma......i... +| 2992: 00 01 01 6f 03 08 08 00 00 02 6e 69 03 04 02 00 ...o......ni.... +| 3008: 01 01 6f 06 03 08 00 04 06 00 01 01 75 03 06 06 ..o.........u... +| 3024: 00 00 02 6f 63 03 07 04 00 01 01 66 03 08 06 00 ...oc......f.... +| 3040: 00 02 70 61 03 06 07 00 01 01 72 03 07 07 00 00 ..pa......r..... +| 3056: 02 71 75 06 03 07 00 05 05 00 00 02 72 65 03 05 .qu.........re.. +| 3072: 07 00 00 02 73 65 03 02 02 00 01 01 69 06 01 05 ....se......i... +| 3088: 00 06 03 00 01 01 75 03 08 02 00 00 02 74 65 03 ......u......te. +| 3104: 02 05 00 00 02 75 6c 03 03 0a 00 01 01 74 09 02 .....ul......t.. +| 3120: 07 00 01 02 00 01 03 00 00 02 76 65 06 03 06 00 ..........ve.... +| 3136: 02 0a 00 01 01 6f 03 05 09 00 82 0a 02 08 02 08 .....o.......... +| 3152: 08 08 17 84 02 04 00 30 20 32 35 31 00 01 61 13 .......0 251..a. +| 3168: 01 06 04 00 01 0c 00 01 04 00 01 04 00 01 03 00 ................ +| 3184: 03 09 00 00 01 63 10 01 07 00 03 07 03 00 02 02 .....c.......... +| 3200: 00 01 05 00 01 04 00 00 01 64 11 01 04 00 01 03 .........d...... +| 3216: 09 00 03 02 05 00 01 03 00 02 07 00 00 01 65 1b ..............e. +| 3232: 01 09 00 01 04 07 00 01 03 00 80 00 15 03 00 01 ................ +| 3248: 0b 00 01 04 00 01 02 00 01 0b 00 00 01 66 03 06 .............f.. +| 3264: 05 00 00 01 69 0f 01 03 00 01 06 00 03 04 04 04 ....i........... +| 3280: 00 03 03 09 00 00 01 6c 0c 01 02 00 01 08 00 01 .......l........ +| 3296: 0b 00 05 0c 00 00 01 6d 09 02 0b 00 01 05 00 05 .......m........ +| 3312: 08 00 00 01 6e 0c 03 08 00 01 02 00 02 06 00 01 ....n........... +| 3328: 06 00 00 01 6f 06 07 04 00 01 06 00 00 01 70 06 ....o.........p. +| 3344: 06 07 00 01 07 00 00 01 71 06 03 07 00 05 05 00 ........q....... +| 3360: 00 01 72 03 05 07 00 00 01 73 0c 01 05 00 01 02 ..r......s...... +| 3376: 00 05 03 00 01 02 00 00 01 74 03 02 05 00 00 01 .........t...... +| 3392: 75 0a 02 07 00 01 02 0a 00 01 03 00 00 01 76 07 u.............v. +| 3408: 03 06 00 02 09 03 00 85 26 01 08 08 08 08 08 17 ........&....... +| 3424: 8a 3e 30 20 36 36 35 00 02 61 64 03 03 04 00 02 .>0 665..ad..... +| 3440: 08 69 70 69 73 63 69 6e 67 03 01 08 00 01 05 6c .ipiscing......l +| 3456: 69 71 75 61 03 02 0c 00 05 02 69 70 03 04 04 00 iqua......ip.... +| 3472: 01 03 6d 65 74 03 01 06 00 01 03 6e 69 6d 03 08 ..met......nim.. +| 3488: 09 00 01 03 75 74 65 03 05 03 00 00 06 63 69 6c ....ute......cil +| 3504: 6c 75 6d 03 06 02 00 01 06 6f 6d 6d 6f 64 6f 03 lum......ommodo. +| 3520: 04 07 00 02 09 6e 73 65 63 74 65 74 75 72 03 01 .....nsectetur.. +| 3536: 07 00 05 04 71 75 61 74 03 04 08 00 01 04 75 6c ....quat......ul +| 3552: 70 61 03 08 04 00 02 07 70 69 64 61 74 61 74 03 pa......pidatat. +| 3568: 07 05 00 00 08 64 65 73 65 72 75 6e 74 03 08 07 .....deserunt... +| 3584: 00 01 01 6f 03 02 03 00 02 03 6c 6f 72 06 01 04 ...o......lor... +| 3600: 00 40 05 00 05 01 65 06 02 0a 00 04 03 00 01 03 .@....e......... +| 3616: 75 69 73 03 05 02 00 00 02 65 61 03 04 06 00 01 uis......ea..... +| 3632: 06 69 75 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 .iusmod......lit +| 3648: 03 01 09 00 01 03 6e 69 6d 03 03 03 00 01 03 73 ......nim......s +| 3664: 73 65 03 05 0b 00 02 01 74 03 08 0b 00 01 01 74 se......t......t +| 3680: 03 02 09 00 01 01 75 03 06 04 00 01 01 78 03 04 ......u......x.. +| 3696: 05 00 02 07 63 65 70 74 65 75 72 03 07 02 00 02 ....cepteur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 6e 74 03 02 06 00 01 04 70 73 cididunt......ps +| 3776: 75 6d 03 01 03 00 01 04 72 75 72 65 03 05 04 00 um......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 05 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 70 72 65 68 65 6e 64 65 72 69 ....reprehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 02 00 01 03 t......sed...... +| 4000: 69 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 int......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 6f 6c 75 70 74 61 74 65 03 05 09 00 ....oluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 02 08 01 04 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0e 0a 04 02 03 00 0e 0b 04 01 03 00 0e 08 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 00 03 00 14 08 45 b5 03 .............E.. +| end crash-7948058d822acb.db +}]} {} + +do_catchsql_test 8.1 { + SELECT matchinfo(t1,'x') FROM t1 WHERE t1 MATCH 'e*'; +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 9.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-e1c6cbfdf643e9.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 35 58 54 45 4e 53 49 4f IT LOAD 5XTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 1f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 44 4e 41 42 4c 45 20 46 54 53 35 58 .#..DNABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 01 00 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 0a 12 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-e1c6cbfdf643e9.db +}]} {} + +do_execsql_test 9.1 { + SELECT count(*) FROM t1 WHERE t1 MATCH '"json1 enable"'; +} {1} + +#------------------------------------------------------------------------- +reset_db +do_test 10.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-c3a971f0061039.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 30 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY0KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 1f MEMSYS5 ENABLE. +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 43 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXCINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 09 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 46 20 47 45 ....)..ENABLF GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 09 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 02 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 10 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 02 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-c3a971f0061039.db +}]} {} + +do_catchsql_test 10.1 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) + INSERT OR IGNORE INTO t1(a,c) SELECT x,null FROM c + UNION ALL SELECT 180-x,printf('[%,d]',x*-5844627) FROM c; +} {0 {}} + +do_catchsql_test 10.3 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 11.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-843cb8447eaf14.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d4 ...t.[.@.$...... +| 48: dd bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 35 99 0c 78 0c 57 0c 3e 0c 24 0c 0a ....5..x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 01 00 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 a2 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 01 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-843cb8447eaf14.db +}]} {} + +do_catchsql_test 11.1 { + SELECT rowid, quote(matchinfo(t1,'pcxybs')) FROM t1 WHERE t1 MATCH 'e*' +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 12.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename c81b.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 01 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 01 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 01 ................ +| 96: 00 2e 30 38 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ..08...........! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 62 2c 72 6f 6f 74 ock INTEGEb,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 46 4e 41 ABLE GEOPOLY FNA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 0f 25 READSAFE=0.$...% +| 3088: 19 58 54 48 52 45 41 44 53 41 46 45 3d 30 42 49 .XTHREADSAFE=0BI +| 3104: 4e 41 52 59 18 23 05 00 0f 25 19 58 54 48 52 45 NARY.#...%.XTHRE +| 3120: 41 44 53 41 46 45 3d 30 4e 4f 43 41 53 45 17 22 ADSAFE=0NOCASE.. +| 3136: 05 00 0f 25 17 58 54 48 52 45 41 44 53 41 46 45 ...%.XTHREADSAFE +| 3152: 3d 30 52 54 52 49 4d 1f 21 05 00 0f 33 19 58 4f =0RTRIM.!...3.XO +| 3168: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3184: 4f 4e 42 49 4e 41 52 59 1f 20 05 00 0f 33 19 58 ONBINARY. ...3.X +| 3200: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3216: 49 4f 4e 4e 4f 43 41 53 45 1e 1f 05 00 0f 33 17 IONNOCASE.....3. +| 3232: 58 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e XOMIT LOAD EXTEN +| 3248: 53 49 4f 4e 52 54 52 49 4d 1f 1e 05 00 0f 33 19 SIONRTRIM.....3. +| 3264: 58 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 XMAX MEMORY=5000 +| 3280: 30 30 30 30 42 49 4e 41 52 59 1f 1d 05 00 0f 33 0000BINARY.....3 +| 3296: 19 58 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 .XMAX MEMORY=500 +| 3312: 30 30 30 30 30 4e 4f 43 41 53 45 1e 1c 05 00 0f 00000NOCASE..... +| 3328: 33 17 58 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 3.XMAX MEMORY=50 +| 3344: 30 30 30 30 30 30 52 54 52 49 4d 18 1b 05 00 0f 000000RTRIM..... +| 3360: 25 19 58 45 4e 41 42 4c 45 20 52 54 52 45 45 42 %.XENABLE RTREEB +| 3376: 49 4e 41 52 59 18 1a 05 00 0f 25 19 58 45 4e 41 INARY.....%.XENA +| 3392: 42 4c 45 20 52 54 52 45 45 4e 4f 43 41 53 45 17 BLE RTREENOCASE. +| 3408: 19 05 00 0f 25 17 58 45 4e 41 42 4c 45 20 52 54 ....%.XENABLE RT +| 3424: 52 45 45 52 54 52 49 4d 1a 18 05 00 0f 29 19 58 REERTRIM.....).X +| 3440: 45 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 42 49 ENABLE MEMSYS5BI +| 3456: 4e 41 52 59 1a 17 05 00 0f 29 19 58 45 4e 41 42 NARY.....).XENAB +| 3472: 4c 45 20 4d 45 4d 53 59 53 35 4e 4f 43 41 53 45 LE MEMSYS5NOCASE +| 3488: 19 16 05 00 0f 29 17 58 45 4e 41 42 4c 45 20 4d .....).XENABLE M +| 3504: 45 4d 53 59 53 35 52 54 52 49 4d 18 15 05 00 0f EMSYS5RTRIM..... +| 3520: 25 19 58 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 42 %.XENABLE JSON1B +| 3536: 49 4e 41 52 59 18 14 05 00 0f 25 19 58 45 4e 41 INARY.....%.XENA +| 3552: 42 4c 45 20 4a 53 4f 4e 31 4e 4f 43 41 53 45 17 BLE JSON1NOCASE. +| 3568: 13 05 00 0f 25 17 58 45 4e 41 42 4c 45 20 4a 53 ....%.XENABLE JS +| 3584: 4f 4e 31 52 54 52 49 4d 1a 12 05 00 0f 29 19 58 ON1RTRIM.....).X +| 3600: 45 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 42 49 ENABLE GEOPOLYBI +| 3616: 4e 41 52 59 1a 11 05 00 0f 29 19 58 45 4e 41 1e NARY.....).XENA. +| 3632: 4c 45 20 47 45 4f 50 4f 4c 59 4e 4f 43 41 53 45 LE GEOPOLYNOCASE +| 3648: 19 10 05 00 0f 29 17 58 45 4e 41 42 4c 45 20 47 .....).XENABLE G +| 3664: 45 4f 50 4f 4c 59 52 54 52 49 4d 17 0f 05 00 0f EOPOLYRTRIM..... +| 3680: 23 19 58 45 4e 41 42 4c 45 20 46 54 53 35 42 49 #.XENABLE FTS5BI +| 3696: 4e 41 52 59 17 0e 05 00 0f 23 19 58 55 4e 41 42 NARY.....#.XUNAB +| 3712: 4c 45 20 46 54 53 35 4e 4f 43 41 53 45 16 0d 05 LE FTS5NOCASE... +| 3728: 00 0f 23 17 58 45 4e 41 42 4c 45 20 46 54 53 35 ..#.XENABLE FTS5 +| 3744: 52 54 52 49 4d 17 0c 05 00 0f 23 19 58 45 4e 41 RTRIM.....#.XENA +| 3760: 42 4c 45 20 46 54 53 34 42 49 4e 41 52 59 17 0b BLE FTS4BINARY.. +| 3776: 05 00 0f 23 19 58 45 4e 41 42 4c 45 20 46 54 53 ...#.XENABLE FTS +| 3792: 35 4e 4f 43 40 53 45 16 0a 05 00 0f 23 17 58 45 5NOC@SE.....#.XE +| 3808: 4e 41 42 4c 45 20 46 54 53 34 52 54 52 49 4d 1e NABLE FTS4RTRIM. +| 3824: 09 05 00 0f 31 19 58 45 4e 41 42 4c 35 20 44 42 ....1.XENABL5 DB +| 3840: 53 54 41 54 20 56 54 41 42 42 49 4e 41 52 59 1e STAT VTABBINARY. +| 3856: 08 05 00 0f 31 19 58 45 4e 41 42 4c 45 20 44 42 ....1.XENABLE DB +| 3872: 53 54 41 54 20 56 54 41 42 4e 4f 43 41 53 45 1d STAT VTABNOCASE. +| 3888: 07 05 00 0f 31 17 58 45 4e 41 42 4c 45 20 44 42 ....1.XENABLE DB +| 3904: 53 54 41 54 20 56 54 41 42 52 54 52 49 4d 11 06 STAT VTABRTRIM.. +| 3920: 05 00 0f 17 19 58 44 45 42 55 47 42 49 4e 41 52 .....XDEBUGBINAR +| 3936: 59 11 05 05 00 0f 17 19 58 44 45 42 55 47 4e 4f Y.......XDEBUGNO +| 3952: 43 41 53 45 10 04 05 00 0f 17 17 58 44 45 42 55 CASE.......XDEBU +| 3968: 47 52 54 52 49 4d 27 03 05 00 0f 43 19 58 43 4f GRTRIM'....C.XCO +| 3984: 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 MPILER=gcc-5.4.0 +| 4000: 20 32 30 31 36 30 36 30 39 42 49 4e 41 52 59 27 20160609BINARY' +| 4016: 02 05 00 0f 43 19 58 43 4f 4d 50 49 4c 45 52 3d ....C.XCOMPILER= +| 4032: 67 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 gcc-5.4.0 201606 +| 4048: 30 39 4e 4f 43 41 53 45 26 01 05 00 0f 43 17 58 09NOCASE&....C.X +| 4064: 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 COMPILER=gcc-5.4 +| 4080: 2e 30 20 32 30 31 36 30 36 30 39 52 54 52 49 4d .0 20160609RTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 03 07 bb 00 0c ad 0b a0 07 bb 00 00 ................ +| 1968: 00 00 00 00 00 00 00 00 00 00 00 87 62 03 08 08 ............b... +| 1984: 01 08 08 17 8f 34 02 30 20 39 38 30 00 01 30 1e .....4.0 980..0. +| 2000: 01 01 01 06 00 01 01 01 06 00 01 01 01 06 00 1f ................ +| 2016: 01 01 03 00 01 01 01 03 00 01 01 01 03 00 00 08 ................ +| 2032: 32 30 31 36 30 36 30 39 0f 01 01 01 07 00 01 01 20160609........ +| 2048: 01 07 00 01 01 01 07 00 00 01 34 0f 01 01 01 05 ..........4..... +| 2064: 00 01 01 01 05 00 01 01 01 05 00 00 01 35 0f 01 .............5.. +| 2080: 01 01 04 00 01 01 01 04 00 01 01 01 04 00 01 07 ................ +| 2096: 30 30 30 30 30 30 30 0f 1c 01 01 04 00 01 01 01 0000000......... +| 2112: 04 00 01 01 01 04 00 00 06 62 69 6e 61 72 79 3c .........binary< +| 2128: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 2144: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 2160: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 2176: 02 00 03 01 02 02 00 03 01 02 02 00 00 08 63 6f ..............co +| 2192: 6d 70 69 6c 65 72 0f 01 01 01 02 00 01 01 01 02 mpiler.......... +| 2208: 00 01 01 01 02 00 00 06 64 62 73 74 61 74 0f 07 ........dbstat.. +| 2224: 01 01 03 00 01 01 01 03 00 01 01 01 03 00 01 04 ................ +| 2240: 65 62 75 67 0f 04 01 01 02 00 01 01 01 02 00 01 ebug............ +| 2256: 01 01 02 00 00 03 65 6e 61 05 11 01 01 02 00 03 ......ena....... +| 2272: 03 62 6c 35 05 09 01 01 02 00 05 01 65 5a 07 01 .bl5........eZ.. +| 2288: 01 02 00 01 01 01 02 00 02 01 01 02 00 01 01 01 ................ +| 2304: 02 00 01 01 01 02 00 01 01 01 02 00 02 01 01 02 ................ +| 2320: 00 01 01 01 02 00 02 01 01 02 00 01 01 01 02 00 ................ +| 2336: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 2352: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 2368: 01 02 00 01 01 01 02 00 01 08 78 74 65 6e 73 69 ..........xtensi +| 2384: 6f 6e 0f 1f 01 01 04 00 01 01 01 04 00 01 01 01 on.............. +| 2400: 04 00 00 04 66 74 73 34 0a 0a 01 01 03 00 02 01 ....fts4........ +| 2416: 01 03 00 03 01 35 14 0b 01 01 03 00 02 01 01 03 .....5.......... +| 2432: 00 01 01 01 03 00 01 01 01 03 00 00 03 67 63 63 .............gcc +| 2448: 0f 01 01 01 03 00 01 01 01 03 00 01 01 01 03 00 ................ +| 2464: 01 06 65 6f 70 6f 6c 79 0f 10 01 01 03 00 01 01 ..eopoly........ +| 2480: 01 04 00 01 01 01 03 00 00 05 6a 73 6f 6e 31 0f ..........json1. +| 2496: 13 01 01 03 00 01 01 01 03 00 01 01 01 03 00 00 ................ +| 2512: 02 6c 65 05 11 01 01 03 00 01 03 6f 61 64 0f 1f .le........oad.. +| 2528: 01 01 03 00 01 01 01 03 00 01 01 01 03 00 00 03 ................ +| 2544: 6d 61 78 0f 1c 01 01 02 00 01 01 01 02 00 01 01 max............. +| 2560: 01 02 00 01 05 65 6d 6f 72 79 0f 1c 01 01 03 00 .....emory...... +| 2576: 01 01 01 03 00 01 01 01 03 00 03 04 73 79 73 35 ............sys5 +| 2592: 0f 16 01 01 03 00 01 01 01 03 00 01 01 01 03 00 ................ +| 2608: 00 03 6e 6f 63 05 0b 01 02 02 00 03 03 61 73 65 ..noc........ase +| 2624: 37 02 01 02 02 00 03 01 02 02 00 03 01 02 02 00 7............... +| 2640: 06 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 2656: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 2672: 02 02 00 03 01 02 02 00 00 04 6f 6d 69 74 0f 1f ..........omit.. +| 2688: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 00 05 ................ +| 2704: 72 74 72 65 65 0f 19 01 01 03 00 01 01 01 03 00 rtree........... +| 2720: 01 01 01 03 00 03 02 69 6d 3c 01 01 02 02 00 03 .......im<...... +| 2736: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 2752: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 2768: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 2784: 00 03 01 02 02 00 00 02 73 65 05 0b 01 02 03 00 ........se...... +| 2800: 00 0a 74 68 72 65 61 64 73 61 66 65 0f 22 01 01 ..threadsafe.... +| 2816: 02 00 01 01 01 02 00 01 01 01 02 00 00 06 75 6e ..............un +| 2832: 61 62 6c 65 05 0e 01 01 02 00 00 04 76 74 61 62 able........vtab +| 2848: 0f 07 01 01 04 00 01 01 01 04 00 01 01 01 04 00 ................ +| 2864: 00 01 78 6c 01 02 00 01 02 00 01 02 00 01 02 00 ..xl............ +| 2880: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 2896: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 2912: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 2928: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 2944: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 2960: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 11 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 00 f6 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 01 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 10 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 02 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 03 0f ee 00 0f fb 0f f5 0f ee 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 06 04 ................ +| 4080: 08 01 01 02 03 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0c f4 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end c81b.db +}]} {} + +do_catchsql_test 12.1 { + SELECT rowid, quote(matchinfo(t1,'pcxybspcxybs')) + FROM t1 WHERE t1 MATCH 'e*e*' +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_test 13.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-c666cfde112dee.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 07 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 62 2c 72 6f 6f 74 ock INTEGEb,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 23 00 20 32 30 31 36 30 36 30 39 20 44 45 42 4#. 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 53 49 4d 18 1b 05 00 25 00000XRTSIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 52 4c 45 20 4a 53 4f ...%..ENARLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 1e 4c NARY....)..ENA.L +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 59 e5 58 .#..ENABLE FTY.X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 ..#..ENABLE FTS5 +| 3792: 58 4e 4f 43 40 53 45 16 0a 05 00 23 0f 17 45 4e XNOC@SE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2f 30 20 32 30 31 36 30 36 30 cc-5.4/0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 41 00 04 6c 6f 61 64 03 25 1c 00 n1.%.A..load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 02 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 f2 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 57 02 00 .............W.. +| 3504: 01 02 00 01 01 00 01 02 00 01 02 00 01 02 10 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 64 6e 73 69 6f .........xtdnsio +| 3552: 6e 09 1f 04 00 01 04 00 01 03 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 57 63 63 09 01 03 ..........Wcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 02 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-c666cfde112dee.db +}]} {} + +do_catchsql_test 13.1 { + SELECT quote(matchinfo(t1,'pcxybs'))==0 FROM t1 WHERE b MATCH 'e*'; +} {0 {0 0}} + +#------------------------------------------------------------------------- +reset_db +do_test 14.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-f7b636a855e1d2.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e ef 00 07 0d 4d 00 0f bd 0f 5f ..........M...._ +| 112: 0e f7 0e 06 0e bc 0d a4 0d 4d 00 00 00 00 00 00 .........M...... +| 3392: 00 00 00 00 00 00 00 00 00 00 00 00 00 55 07 07 .............U.. +| 3408: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 73 74 ......tablet1_st +| 3424: 61 74 74 31 5f 73 74 61 74 07 43 52 45 41 54 45 att1_stat.CREATE +| 3440: 20 54 41 42 4c 45 20 27 74 31 5f 73 74 61 74 27 TABLE 't1_stat' +| 3456: 28 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d (id INTEGER PRIM +| 3472: 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 ARY KEY, value B +| 3488: 4c 4f 42 29 60 06 07 17 21 21 01 81 0b 74 61 62 LOB)`...!!...tab +| 3504: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3520: 6f 63 73 69 7a 65 06 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3536: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3552: 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 (docid INTEGER P +| 3568: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65 RIMARY KEY, size +| 3584: 20 42 4c 4f 42 29 81 33 04 07 17 1f 1f 01 82 35 BLOB).3.......5 +| 3600: 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 74 31 tablet1_segdirt1 +| 3616: 5f 73 65 67 64 69 25 04 43 52 45 41 54 45 20 54 _segdi%.CREATE T +| 3632: 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 72 27 ABLE 't1_segdir' +| 3648: 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 (level INTEGER,i +| 3664: 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 72 74 dx INTEGER,start +| 3680: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c _block INTEGER,l +| 3696: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 eaves_end_block +| 3712: 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 INTEGER,end_bloc +| 3728: 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 k INTEGER,root B +| 3744: 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 LOB,PRIMARY KEY( +| 3760: 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 05 06 17 level, idx))1... +| 3776: 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 65 5f E...indexsqlite_ +| 3792: 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 65 67 autoindex_t1_seg +| 3808: 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 05 00 dir_1t1_segdir.. +| 3824: 00 00 08 00 00 00 00 66 03 07 17 23 23 01 81 13 .......f...##... +| 3840: 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e 74 73 tablet1_segments +| 3856: 74 31 5f 73 65 67 6d 65 6e 74 73 03 43 52 45 41 t1_segments.CREA +| 3872: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 TE TABLE 't1_seg +| 3888: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 ments'(blockid I +| 3904: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K +| 3920: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c EY, block BLOB). +| 3936: 02 07 17 21 21 01 81 03 74 61 62 6c 65 74 31 5f ...!!...tablet1_ +| 3952: 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 65 6e contentt1_conten +| 3968: 74 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 t.CREATE TABLE ' +| 3984: 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 t1_content'(doci +| 4000: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 4016: 59 20 4b 45 59 2c 20 27 63 30 61 27 29 41 01 06 Y KEY, 'c0a')A.. +| 4032: 17 11 11 08 71 74 61 62 6c 65 74 31 74 31 43 52 ....qtablet1t1CR +| 4048: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4064: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34 LE t1 USING fts4 +| 4080: 28 61 2c 70 72 65 66 69 78 3d 27 31 2c 32 27 29 (a,prefix='1,2') +| page 2 offset 4096 +| 0: 0d 00 00 00 08 0e 1f 00 0f c4 0f 7c 0f 34 0f 07 ...........|.4.. +| 16: 0e c3 0e 97 0e 63 0e 1f 00 00 00 00 00 00 00 00 .....c.......... +| 3600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +| 3616: 08 04 00 81 09 73 75 6e 74 20 69 6e 20 63 75 6c .....sunt in cul +| 3632: 70 61 20 71 75 69 20 6f 66 66 69 63 69 61 20 64 pa qui officia d +| 3648: 65 73 65 72 75 6e 74 20 6d 6f 6c 6c 69 74 20 61 eserunt mollit a +| 3664: 6e 69 6d 20 69 64 20 65 73 74 20 6c 61 62 6f 72 nim id est labor +| 3680: 75 6d 2e 32 07 03 01 6b 45 78 63 65 70 74 65 75 um.2...kExcepteu +| 3696: 72 20 73 69 6e 74 20 6f 63 63 61 65 63 61 74 20 r sint occaecat +| 3712: 63 75 70 69 64 61 74 61 74 20 6e 6f 6e 20 70 72 cupidatat non pr +| 3728: 6f 69 64 65 6e 74 2c 2a 06 03 00 5b 63 69 6c 6c oident,*...[cill +| 3744: 75 6d 20 64 6f 6c 6f 72 65 20 65 75 20 66 75 67 um dolore eu fug +| 3760: 69 61 74 20 6e 75 6c 6c 61 20 70 61 72 69 61 74 iat nulla pariat +| 3776: 75 72 2e 43 05 04 00 81 09 44 75 69 73 20 61 75 ur.C.....Duis au +| 3792: 74 65 20 69 72 75 72 65 20 64 6f 6c 6f 72 20 69 te irure dolor i +| 3808: 6e 20 72 65 70 72 65 68 65 6e 64 65 72 69 74 20 n reprehenderit +| 3824: 69 6e 20 76 6f 6c 75 70 74 61 74 65 20 76 65 6c in voluptate vel +| 3840: 69 74 20 65 73 73 65 2b 14 03 00 5d 6e 69 73 69 it esse+...]nisi +| 3856: 20 75 74 20 61 6c 69 71 75 69 70 20 65 78 20 65 ut aliquip ex e +| 3872: 61 20 63 6f 6d 6d 6f 64 6f 20 63 6f 6e 73 65 71 a commodo conseq +| 3888: 75 61 74 2e 46 03 04 00 81 11 55 74 20 65 6e 69 uat.F.....Ut eni +| 3904: 6d 20 61 64 20 6d 69 6e 69 6d 20 76 65 6e 69 61 m ad minim venia +| 3920: 6d 2c 20 71 75 69 73 20 6e 6f 73 74 72 75 64 20 m, quis nostrud +| 3936: 65 78 65 72 63 69 74 61 74 69 6f 6e 20 75 6c 6c exercitation ull +| 3952: 61 6d 63 6f 20 6c 61 62 6f 72 69 73 46 02 04 00 amco laborisF... +| 3968: 81 11 73 65 64 20 64 6f 20 65 69 75 73 6d 6f 64 ..sed do eiusmod +| 3984: 20 74 65 6d 70 6f 72 20 69 6e 63 69 64 69 64 75 tempor incididu +| 4000: 6e 74 20 75 74 20 6c 61 62 6f 72 65 20 65 74 20 nt ut labore et +| 4016: 64 6f 6c 6f 72 65 20 6d 61 67 6e 61 20 61 6c 69 dolore magna ali +| 4032: 71 75 61 2e 3a 01 03 00 7b 4c 6f 72 65 6d 20 69 qua.:....Lorem i +| 4048: 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 20 61 psum dolor sit a +| 4064: 6d 65 74 2c 20 63 6f 6e 73 65 63 74 65 74 75 72 met, consectetur +| 4080: 20 61 64 69 70 69 73 63 69 6e 67 20 65 6c 69 74 adipiscing elit +| page 3 offset 8192 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0a a6 00 0d 57 0c 4a 0a a6 00 00 .........W.J.... +| 2720: 00 00 00 00 00 00 83 21 03 08 02 08 08 08 17 86 .......!........ +| 2736: 30 08 00 30 20 34 30 32 00 02 61 64 06 01 08 00 0..0 402..ad.... +| 2752: 02 04 00 01 01 6c 06 02 0c 00 02 04 00 01 01 6d .....l.........m +| 2768: 03 01 06 00 01 01 6e 03 08 09 00 01 01 75 03 05 ......n......u.. +| 2784: 03 00 00 02 63 69 03 06 01 00 01 01 6f 07 01 07 ....ci......o... +| 2800: 00 03 07 03 00 01 01 75 06 07 05 00 01 04 00 00 .......u........ +| 2816: 02 64 65 03 08 07 00 01 01 6f 0d 01 04 00 01 03 .de......o...... +| 2832: 09 00 03 05 00 01 03 00 01 01 75 03 05 02 00 00 ..........u..... +| 2848: 02 65 61 03 04 06 00 01 01 69 03 02 04 00 01 01 .ea......i...... +| 2864: 6c 03 01 09 00 01 01 6e 03 03 03 00 01 01 73 06 l......n......s. +| 2880: 05 0b 00 03 0b 00 01 01 74 03 02 09 00 01 01 75 ........t......u +| 2896: 03 06 04 00 01 01 78 09 03 09 00 01 05 00 03 02 ......x......... +| 2912: 00 00 02 66 75 03 06 05 00 00 02 69 64 03 08 0a ...fu......id... +| 2928: 00 01 01 6e 0a 02 06 00 03 06 04 00 03 03 00 01 ...n............ +| 2944: 01 70 03 01 13 00 01 01 72 03 05 04 00 00 02 6c .p......r......l +| 2960: 61 09 02 08 00 01 0b 00 05 0c 00 01 01 6f 03 01 a............o.. +| 2976: 02 00 00 02 6d 61 03 02 0b 00 01 01 69 03 04 05 ....ma......i... +| 2992: 00 01 01 6f 03 08 08 00 00 02 6e 69 03 04 02 00 ...o......ni.... +| 3008: 01 01 6f 06 03 08 00 04 06 00 01 01 75 03 06 06 ..o.........u... +| 3024: 00 00 02 6f 63 03 07 04 00 01 01 66 03 08 06 00 ...oc......f.... +| 3040: 00 02 70 61 03 06 07 00 01 01 72 03 07 07 00 00 ..pa......r..... +| 3056: 02 71 75 06 03 07 00 05 05 00 00 02 72 65 03 05 .qu.........re.. +| 3072: 07 00 00 02 73 65 03 02 02 00 01 01 69 06 01 05 ....se......i... +| 3088: 00 06 03 00 01 01 75 03 08 02 00 00 02 74 65 03 ......u......te. +| 3104: 03 05 00 00 02 75 6c 03 03 0a 00 01 01 74 09 02 .....ul......t.. +| 3120: 07 00 01 02 00 01 03 00 00 02 76 65 06 03 06 00 ..........ve.... +| 3136: 02 0a 00 01 01 6f 03 05 09 00 82 0a 02 08 02 08 .....o.......... +| 3152: 08 08 17 84 02 04 00 30 20 32 35 31 00 01 61 13 .......0 251..a. +| 3168: 01 06 04 00 01 0c 00 01 04 00 01 04 00 01 03 00 ................ +| 3184: 03 09 00 00 01 63 10 01 07 00 03 07 03 00 02 02 .....c.......... +| 3200: 00 01 05 00 01 04 00 00 01 64 11 01 04 00 01 03 .........d...... +| 3216: 09 00 03 02 05 00 01 03 00 02 07 00 00 01 65 1b ..............e. +| 3232: 01 09 00 01 04 07 00 01 03 08 00 01 05 03 00 01 ................ +| 3248: 0b 00 01 04 00 01 02 00 01 0b 00 00 01 66 03 06 .............f.. +| 3264: 05 00 00 01 69 0f 01 03 00 01 06 00 03 04 04 04 ....i........... +| 3280: 00 03 03 09 00 00 01 6c 0c 01 02 00 01 08 00 01 .......l........ +| 3296: 0b 00 05 0c 00 00 01 6d 09 02 0b 00 01 05 00 05 .......m........ +| 3312: 08 00 00 01 6e 0c 03 08 00 01 02 00 02 06 00 01 ....n........... +| 3328: 06 00 00 01 6f 06 07 04 00 01 06 00 00 01 70 06 ....o.........p. +| 3344: 06 07 00 01 07 00 00 01 71 06 03 07 00 05 05 00 ........q....... +| 3360: 00 01 72 03 05 08 00 00 01 73 0c 01 05 00 01 02 ..r......s...... +| 3376: 00 05 03 00 01 02 00 00 01 74 03 02 05 00 00 01 .........t...... +| 3392: 75 0a 02 07 00 01 02 0a 00 01 03 00 00 01 76 07 u.............v. +| 3408: 03 06 00 02 09 03 00 85 26 01 08 08 08 08 08 17 ........&....... +| 3424: 8a 3e 30 20 36 36 35 00 02 61 64 03 03 04 00 02 .>0 665..ad..... +| 3440: 08 69 70 69 73 63 69 6e 67 03 01 08 00 01 05 6c .ipiscing......l +| 3456: 69 71 75 61 03 02 0c 00 05 02 69 70 03 04 04 00 iqua......ip.... +| 3472: 01 03 6d 65 74 03 01 06 00 01 03 6e 69 6d 03 08 ..met......nim.. +| 3488: 09 00 01 03 75 74 65 03 05 03 00 00 06 63 69 6c ....ute......cil +| 3504: 6c 75 6d 03 06 02 00 01 06 6f 6d 6d 6f 64 6f 03 lum......ommodo. +| 3520: 04 07 00 02 09 6e 73 65 63 74 65 74 75 72 03 01 .....nsectetur.. +| 3536: 07 00 05 04 71 75 61 74 03 04 08 00 01 04 75 6c ....quat......ul +| 3552: 70 61 03 08 04 00 02 07 70 69 64 61 74 61 74 03 pa......pidatat. +| 3568: 07 05 00 00 08 64 65 73 65 72 75 6e 74 03 08 07 .....deserunt... +| 3584: 00 01 01 6f 03 02 03 00 02 03 6c 6f 72 06 01 04 ...o......lor... +| 3600: 00 04 05 00 05 01 65 06 02 0a 00 04 03 00 01 03 ......e......... +| 3616: 75 69 73 03 05 02 00 00 02 65 61 03 04 06 00 01 uis......ea..... +| 3632: 06 69 75 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 .iusmod......lit +| 3648: 03 01 09 00 01 03 6e 69 6d 03 03 03 00 01 03 73 ......nim......s +| 3664: 73 65 03 05 0b 00 02 01 73 03 08 0b 00 01 01 74 se......s......t +| 3680: 03 02 09 00 01 01 75 03 06 04 00 01 01 78 03 04 ......u......x.. +| 3696: 05 00 02 07 63 65 70 74 65 75 72 03 07 02 00 02 ....cepteur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 6e 74 03 02 06 00 01 04 70 73 cididunt......ps +| 3776: 75 6d 03 01 03 00 01 04 72 75 72 65 03 05 04 00 um......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 05 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 70 72 65 68 65 6e 64 65 72 69 ....reprehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 02 00 01 03 t......sed...... +| 4000: 69 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 int......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 6f 6c 75 70 74 61 74 65 03 05 09 00 ....oluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 02 08 01 04 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0e 0a 04 02 03 00 0e 0b 04 01 03 00 0e 08 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 00 03 00 14 08 45 b5 03 .............E.. +| end crash-f7b636a855e1d2.db +}]} {} + +do_execsql_test 14.1 { + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<10) + INSERT INTO t1(a) SELECT randomblob(3000) FROM c; +} + +do_catchsql_test 14.2 { + INSERT INTO t1(t1) VALUES('optimize'); +} {1 {database disk image is malformed}} + +#------------------------------------------------------------------------- +reset_db +do_execsql_test 15.0 { + CREATE VIRTUAL TABLE t1 USING fts3(a, content=""); + INSERT INTO t1_segdir VALUES(0,0,0,0,'0 665',X'000261640303040002086970697363696e670301080001056c6971756103020c00050269700304040001036d65740301060001036e6a6d03080900010375746503050300000663696c6c756d0306020001066f6d6d6f646f0304070002096e736563746574757203010700050471756174030408000104756c7061030804000207706964617461740307050000086465736572756e740308070001016f0302030002036c6f720601040004050005016506020a00040300010375697303050200000265610304060001066975736d6f640302040001036c69740301090001036e696d13030300010373736503050b0002017403080b0001017403020900010175030604000101780304050002076365707465757203070100020a65726369746174696f6e030309000006667567696174030605000002696403080a0001016e070506040003030002086369646964756e740302060001047073756d030103000104727572650305040000066c61626f7265030208000502697303030b000502756d03080c0001046f72656d0301020000056d61676e6103020b000104696e696d0303050001056f6c6c69740308080000046e6973690304020001026f6e0307060002057374727564030308000104756c6c610306060000086f636361656361740307040001066666696369610308060000087061726961747572030607000107726f6964656e740307070000037175690308050003017303030700000d726570726568656e6465726974030507000003736564030202000103696e7403070300020174030105000103756e7403080200000674656d706f72030205000007756c6c616d636f03030a0001017409020700010200010300000576656c697403050a0002046e69616d0303060001086f6c75707461746503050900'); +} + +do_execsql_test 15.1 { + SELECT quote(matchinfo(t1, t1 ))==0 FROM t1 WHERE t1 MATCH 'e*'; +} {0 0 0 0 0 0} + +#------------------------------------------------------------------------- +reset_db +do_test 16.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-de7e8cb026385a.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 06 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e ef 00 07 0d 4d 00 0f bd 0f 5f ..........M...._ +| 112: 0e f7 0e 06 0e bc 0d a4 0d 4d 00 00 00 00 00 00 .........M...... +| 3392: 00 00 00 00 00 00 00 00 00 00 00 00 00 55 07 07 .............U.. +| 3408: 17 1b 1b 01 81 01 74 61 62 6c 65 74 31 5f 73 74 ......tablet1_st +| 3424: 61 74 74 31 5f 73 74 61 74 07 43 52 45 41 54 45 att1_stat.CREATE +| 3440: 20 54 41 42 4c 45 20 27 74 31 5f 73 74 61 74 27 TABLE 't1_stat' +| 3456: 28 69 64 20 49 af 54 45 47 45 52 20 50 52 49 4d (id I.TEGER PRIM +| 3472: 41 52 59 20 4b 45 59 2c 20 76 61 6c 75 65 20 42 ARY KEY, value B +| 3488: 4c 4f 42 29 60 06 07 17 21 21 01 81 0b 74 61 62 LOB)`...!!...tab +| 3504: 6c 65 74 31 5f 64 6f 63 73 69 7a 65 74 31 5f 64 let1_docsizet1_d +| 3520: 6f 63 73 69 7a 65 06 43 52 45 41 54 45 20 54 41 ocsize.CREATE TA +| 3536: 42 4c 45 20 27 74 31 5f 64 6f 63 73 69 7a 65 27 BLE 't1_docsize' +| 3552: 28 64 6f 63 69 64 20 49 4e 54 45 47 45 52 20 50 (docid INTEGER P +| 3568: 52 49 4d 41 52 59 20 4b 45 59 2c 20 73 69 7a 65 RIMARY KEY, size +| 3584: 20 42 4c 4f 42 29 81 33 04 07 17 1f 1f 01 82 35 BLOB).3.......5 +| 3600: 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 74 31 tablet1_segdirt1 +| 3616: 5f 73 65 67 64 69 72 04 43 52 45 41 54 45 20 54 _segdir.CREATE T +| 3632: 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 72 27 ABLE 't1_segdir' +| 3648: 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 2c 69 (level INTEGER,i +| 3664: 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 72 74 dx INTEGER,start +| 3680: 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 2c 6c _block INTEGER,l +| 3696: 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 6b 20 eaves_end_block +| 3712: 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c 6f 63 INTEGER,end_bloc +| 3728: 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 20 42 k INTEGER,root B +| 3744: 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 59 28 LOB,PRIMARY KEY( +| 3760: 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 05 06 17 level, idx))1... +| 3776: 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 65 5f E...indexsqlite_ +| 3792: 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 65 67 autoindex_t1_seg +| 3808: 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 05 00 dir_1t1_segdir.. +| 3824: 00 00 08 00 00 00 00 66 03 07 17 23 23 01 81 13 .......f...##... +| 3840: 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e 74 73 tablet1_segments +| 3856: 74 31 5f 73 65 67 6d 65 6e 74 73 03 43 52 45 41 t1_segments.CREA +| 3872: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 TE TABLE 't1_seg +| 3888: 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 20 49 ments'(blockid I +| 3904: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b NTEGER PRIMARY K +| 3920: 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 29 5c EY, block BLOB). +| 3936: 02 07 17 21 21 01 81 03 74 61 62 6c 65 74 31 5f ...!!...tablet1_ +| 3952: 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 65 6e contentt1_conten +| 3968: 74 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 t.CREATE TABLE ' +| 3984: 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 63 69 t1_content'(doci +| 4000: 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 d INTEGER PRIMAR +| 4016: 59 20 4b 45 59 2c 20 27 63 30 61 27 29 41 01 06 Y KEY, 'c0a')A.. +| 4032: 17 11 11 08 71 74 61 62 6c 65 74 31 74 31 43 52 ....qtablet1t1CR +| 4048: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4064: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 34 LE t1 USING fts4 +| 4080: 28 61 2c 70 72 65 66 69 78 3d 27 31 2c 32 27 29 (a,prefix='1,2') +| page 2 offset 4096 +| 0: 0d 00 00 00 08 0e 1f 00 0f c4 0f 7c 0f 34 0f 07 ...........|.4.. +| 16: 0e c3 0e 97 0e 63 0e 1f 00 00 00 00 00 00 00 00 .....c.......... +| 3600: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 42 ...............B +| 3616: 08 04 00 81 09 73 75 6e 74 20 69 6e 20 63 75 6c .....sunt in cul +| 3632: 70 61 20 71 75 69 20 6f 66 66 69 63 69 61 20 64 pa qui officia d +| 3648: 65 73 65 72 75 6e 74 20 6d 6f 6c 6c 69 74 20 61 eserunt mollit a +| 3664: 6e 69 6d 20 69 64 20 65 73 74 20 6c 61 62 6f 72 nim id est labor +| 3680: 75 6d 2e 32 07 03 00 6b 45 78 63 65 70 74 65 75 um.2...kExcepteu +| 3696: 72 20 73 69 6e 74 20 6f 63 63 61 65 63 61 74 20 r sint occaecat +| 3712: 63 75 70 69 64 61 74 61 74 20 6e 6f 6e 20 70 72 cupidatat non pr +| 3728: 6f 69 64 65 6e 74 2c 2a 06 03 00 5b 63 69 6c 6c oident,*...[cill +| 3744: 75 6d 20 64 6f 6c 6f 72 65 20 65 75 20 66 75 67 um dolore eu fug +| 3760: 69 61 74 20 6e 75 6c 6c 61 20 70 61 72 69 61 74 iat nulla pariat +| 3776: 75 72 2e 42 05 04 00 81 09 44 75 69 73 20 61 75 ur.B.....Duis au +| 3792: 74 65 20 69 72 75 72 65 21 64 6f 6c 6f 72 20 69 te irure!dolor i +| 3808: 6e 20 72 65 70 72 65 68 65 6e 64 65 72 69 74 20 n reprehenderit +| 3824: 69 6e 20 76 6f 6c 75 70 74 61 74 65 20 76 65 6c in voluptate vel +| 3840: 69 74 20 65 73 74 65 2b 04 03 00 5d 6e 69 73 69 it este+...]nisi +| 3856: 20 75 74 20 61 6c 69 71 75 69 70 20 65 78 20 65 ut aliquip ex e +| 3872: 61 20 63 6f 6d 6d 6f 64 6f 20 63 6f 6e 73 65 71 a commodo conseq +| 3888: 75 61 74 2e 46 03 04 00 81 11 55 74 20 65 6e 69 uat.F.....Ut eni +| 3904: 6d 20 61 64 20 6d 69 6e 69 6d 20 76 65 6e 69 61 m ad minim venia +| 3920: 6d 2c 20 71 75 69 73 20 6e 6f 73 74 72 75 64 20 m, quis nostrud +| 3936: 65 78 65 72 63 69 74 61 74 69 6f 6e 20 75 6c 6c exercitation ull +| 3952: 61 6d 63 6f 20 6c 61 62 6f 72 69 73 46 02 04 00 amco laborisF... +| 3968: 81 11 73 65 64 20 64 6f 20 65 69 75 73 6d 6f 64 ..sed do eiusmod +| 3984: 20 74 65 6d 70 6f 72 20 69 6e 63 69 64 69 64 75 tempor incididu +| 4000: 6e 74 20 75 74 20 6c 61 62 6f 72 65 20 65 74 20 nt ut labore et +| 4016: 64 6f 6c 6f 72 65 20 6d 61 67 6e 61 20 51 6c 69 dolore magna Qli +| 4032: 71 75 61 2e 3a 01 03 00 7b 4c 6f 72 65 6d 20 69 qua.:....Lorem i +| 4048: 70 73 75 6d 20 64 6f 6c 6f 72 20 73 69 74 e5 61 psum dolor sit.a +| 4064: 6d 65 74 2c 20 63 6f 6e 73 65 63 74 65 74 75 72 met, consectetur +| 4080: 20 61 64 69 70 69 73 63 69 6e 67 20 65 6c 69 74 adipiscing elit +| page 3 offset 8192 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 03 0a a6 00 0d 57 0c 4a 0a a6 00 00 .........W.J.... +| 2720: 00 00 00 00 00 00 83 21 03 08 02 08 08 08 17 86 .......!........ +| 2736: 30 08 00 30 20 34 30 32 00 02 61 64 06 01 08 00 0..0 402..ad.... +| 2752: 02 04 00 01 01 6c 06 02 0c 00 02 04 00 01 01 6d .....l.........m +| 2768: 03 01 06 00 01 01 6e 03 08 09 00 01 01 75 03 05 ......n......u.. +| 2784: 03 00 00 02 63 69 03 06 02 00 01 01 6f 07 01 07 ....ci......o... +| 2800: 00 03 07 03 00 01 01 75 06 07 05 00 01 04 00 00 .......u........ +| 2816: 02 64 65 03 08 07 00 01 01 6f 0d 01 04 00 01 03 .de......o...... +| 2832: 09 00 03 05 00 01 03 00 01 01 75 03 05 02 00 00 ..........u..... +| 2848: 02 65 61 03 04 06 00 01 01 69 03 02 04 00 01 01 .ea......i...... +| 2864: 6c 03 01 09 00 01 01 6e 03 03 03 00 01 01 73 06 l......n......s. +| 2880: 05 0b 00 03 0b 00 01 01 74 03 02 09 00 01 01 75 ........t......u +| 2896: 03 06 04 00 01 01 78 09 03 09 00 01 05 00 03 02 ......x......... +| 2912: 00 00 02 66 75 03 06 05 00 00 02 69 64 03 08 0a ...fu......id... +| 2928: 00 01 01 6e 0a 02 06 00 03 06 04 00 03 03 00 01 ...n............ +| 2944: 01 70 03 01 03 00 01 01 72 03 05 04 00 00 02 6c .p......r......l +| 2960: 61 09 02 08 00 01 0b 00 05 0c 00 01 01 6f 03 01 a............o.. +| 2976: 02 00 00 02 6d 61 03 02 0b 00 01 01 69 03 03 05 ....ma......i... +| 2992: 00 01 01 6f 03 08 08 00 00 02 6e 69 03 04 02 00 ...o......ni.... +| 3008: 01 01 6f 06 03 08 00 04 06 00 01 01 75 03 06 06 ..o.........u... +| 3024: 00 00 02 6f 63 03 07 04 00 01 01 66 03 08 06 00 ...oc......f.... +| 3040: 00 02 70 61 03 06 07 00 01 01 72 03 07 07 00 00 ..pa......r..... +| 3056: 02 71 75 06 03 07 00 05 05 00 00 02 72 65 03 05 .qu.........re.. +| 3072: 07 00 00 02 73 65 03 02 02 00 01 01 69 06 01 05 ....se......i... +| 3088: 00 06 03 00 01 01 75 03 08 02 00 00 02 74 65 03 ......u......te. +| 3104: 02 05 00 00 02 75 6c 03 03 0a 00 01 01 74 09 02 .....ul......t.. +| 3120: 07 00 01 02 00 01 03 00 00 02 76 65 06 03 06 00 ..........ve.... +| 3136: 02 0a 00 01 01 6f 03 05 09 00 82 0a 02 08 12 08 .....o.......... +| 3152: 08 08 17 84 02 04 00 30 20 32 35 31 00 01 61 23 .......0 251..a# +| 3168: 01 06 04 00 01 0c 00 01 04 00 01 04 00 01 03 00 ................ +| 3184: 03 09 00 00 01 63 10 01 07 00 03 07 03 00 02 02 .....c.......... +| 3200: 00 01 05 00 01 04 00 00 01 64 11 01 04 00 01 03 .........d...... +| 3216: 09 00 03 02 05 00 01 13 00 02 07 00 00 01 65 1b ..............e. +| 3232: 01 09 00 01 04 07 00 01 03 08 00 01 05 03 00 01 ................ +| 3248: 0b 00 01 04 00 01 02 00 01 0b 00 00 01 66 03 06 .............f.. +| 3264: 05 00 00 01 69 0f 01 03 00 01 06 00 03 04 04 04 ....i........... +| 3280: 00 03 03 09 00 00 01 6c 0c 01 02 00 01 08 00 01 .......l........ +| 3296: 0b 00 05 0c 00 10 01 6d 09 02 0b 00 01 05 00 05 .......m........ +| 3312: 08 00 00 01 6e 0c 03 08 00 01 02 00 02 06 00 01 ....n........... +| 3328: 06 00 00 01 6f 06 07 04 00 01 06 00 00 01 70 06 ....o.........p. +| 3344: 06 07 00 01 07 00 00 01 71 06 03 07 00 05 05 00 ........q....... +| 3360: 00 01 72 03 05 07 00 00 01 73 0c 01 05 00 01 02 ..r......s...... +| 3376: 00 05 03 00 01 02 00 00 01 74 03 02 05 00 00 01 .........t...... +| 3392: 75 0a 02 07 00 01 02 0a 00 01 03 00 00 01 76 07 u.............v. +| 3408: 03 06 00 02 09 03 00 85 26 01 08 08 08 08 08 17 ........&....... +| 3424: 8a 3e 30 20 36 36 35 00 02 61 64 03 03 04 00 02 .>0 665..ad..... +| 3440: 08 69 70 69 73 63 69 6e 67 03 01 08 00 01 05 6c .ipiscing......l +| 3456: 69 71 75 61 03 02 0c 00 05 02 69 70 03 04 04 00 iqua......ip.... +| 3472: 01 03 6d 65 74 03 01 06 00 01 03 6e 69 6d 03 08 ..met......nim.. +| 3488: 09 00 01 03 75 74 65 03 05 03 00 00 06 63 69 6c ....ute......cil +| 3504: 6c 75 6d 03 06 02 00 01 06 6f 6d 6d 6f 64 6f 03 lum......ommodo. +| 3520: 04 07 00 02 09 6e 73 65 63 74 65 74 75 72 03 01 .....nsectetur.. +| 3536: 07 00 05 04 71 75 61 74 03 04 08 00 01 04 75 6c ....quat......ul +| 3552: 70 61 03 08 04 00 02 07 70 69 64 61 74 61 74 03 pa......pidatat. +| 3568: 07 05 00 00 08 64 65 73 65 72 75 6e 74 03 08 07 .....deserunt... +| 3584: 00 01 01 6f 03 02 03 00 02 03 6c 6f 72 06 01 04 ...o......lor... +| 3600: 00 04 05 00 05 01 65 06 02 0a 00 04 03 00 01 03 ......e......... +| 3616: 75 69 73 03 05 02 00 00 02 65 61 03 04 06 00 01 uis......ea..... +| 3632: 06 69 75 73 6d 6f 64 03 02 04 00 01 03 6c 69 74 .iusmod......lit +| 3648: 03 01 09 00 01 03 6e 69 6d 03 03 03 00 01 03 73 ......nim......s +| 3664: 73 65 03 05 0b 00 02 01 74 03 08 0b 00 01 01 74 se......t......t +| 3680: 03 02 09 00 01 01 75 03 06 04 00 01 01 78 03 04 ......u......x.. +| 3696: 05 00 02 07 63 65 70 74 65 75 72 03 07 02 00 02 ....cepteur..... +| 3712: 0a 65 72 63 69 74 61 74 69 6f 6e 03 03 09 00 00 .ercitation..... +| 3728: 06 66 75 67 69 61 74 03 06 05 00 00 02 69 64 03 .fugiat......id. +| 3744: 08 0a 00 01 01 6e 07 05 06 04 00 03 03 00 02 08 .....n.......... +| 3760: 63 69 64 69 64 75 7e 74 03 02 06 00 01 04 70 73 cididu~t......ps +| 3776: 75 6d 03 01 03 00 01 03 72 75 72 65 03 05 04 00 um......rure.... +| 3792: 00 06 6c 61 62 6f 72 65 03 02 08 00 05 02 69 73 ..labore......is +| 3808: 03 03 0b 00 05 02 75 6d 03 08 0c 00 01 04 6f 72 ......um......or +| 3824: 65 6d 03 01 02 00 00 05 6d 61 67 6e 61 03 02 0b em......magna... +| 3840: 00 01 04 69 6e 69 6d 03 03 05 00 01 05 6f 6c 6c ...inim......oll +| 3856: 69 74 03 08 08 00 00 04 6e 69 73 69 03 04 02 00 it......nisi.... +| 3872: 01 02 6f 6e 03 07 06 00 02 05 73 74 72 75 64 03 ..on......strud. +| 3888: 03 08 00 01 04 75 6c 6c 61 03 06 06 00 00 08 6f .....ulla......o +| 3904: 63 63 61 65 63 61 74 03 07 04 00 01 06 66 66 69 ccaecat......ffi +| 3920: 63 69 61 03 08 06 00 00 08 70 61 72 69 61 74 75 cia......pariatu +| 3936: 72 03 06 07 00 01 07 72 6f 69 64 65 6e 74 03 07 r......roident.. +| 3952: 07 00 00 03 71 75 69 03 08 05 00 03 01 73 03 03 ....qui......s.. +| 3968: 07 00 00 0d 72 65 70 72 65 68 65 6e 64 65 72 69 ....reprehenderi +| 3984: 74 03 05 07 00 00 03 73 65 64 03 02 02 00 01 03 t......sed...... +| 4000: 69 6e 74 03 07 03 00 02 01 74 03 01 05 00 01 03 int......t...... +| 4016: 75 6e 74 03 08 02 00 00 06 74 65 6d 70 6f 72 03 unt......tempor. +| 4032: 02 05 00 00 07 75 6c 6c 61 6d 63 6f 03 03 0a 00 .....ullamco.... +| 4048: 01 01 74 09 02 07 00 01 02 00 01 03 00 00 05 76 ..t............v +| 4064: 65 6c 69 74 03 05 0a 00 02 04 6e 69 61 6d 03 03 elit......niam.. +| 4080: 06 00 01 08 6f 6c 75 70 74 61 74 65 03 05 09 00 ....oluptate.... +| page 5 offset 16384 +| 0: 0a 00 00 00 03 0f eb 00 0f fb 0f f3 0f eb 00 00 ................ +| 4064: 00 00 00 00 00 00 00 00 00 00 00 07 04 02 08 01 ................ +| 4080: 08 00 03 07 04 02 08 03 a4 00 02 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 08 0f d0 00 0f fa 0f f4 0f ee 0f e8 ................ +| 16: 0f e2 0f dc 0f d6 0f d0 00 00 00 00 00 00 00 00 ................ +| 4048: 04 08 03 00 0e 0b 04 07 03 00 0e 06 04 06 03 00 ................ +| 4064: 0e 06 04 05 03 00 0e 0a 04 04 03 00 0e 07 04 03 ................ +| 4080: 03 00 0e 0a 04 02 03 00 0e 0b 04 01 03 00 0e 08 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 01 0f f7 00 0f f7 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 07 00 03 00 14 08 45 b5 03 .............E.. +| end crash-de7e8cb026385a.db +}]} {} + +do_catchsql_test 16.1 { + INSERT INTO t1(t1) VALUES('optimize'); +} {0 {}} + +#------------------------------------------------------------------------- +reset_db +do_test 17.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +.open --hexdb +| size 28672 pagesize 4096 filename crash-f15972acf5bc1c.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 03 28 0d 4f 0d 35 0d 1b 0c fb .......(.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 72 7f 00 .........?%..r.. +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 43 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAC EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 14 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 34 ..#..ENABLE FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0e 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 4d 03 25 15 00 00 04 .%....sysM.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 0e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 01 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 10 d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-f15972acf5bc1c.db +}]} {} + +breakpoint +do_execsql_test 17.1 { + BEGIN; + INSERT INTO t1(t1) SELECT x FROM t2; + UPDATE t1 SET b=quote(zeroblob(200)) WHERE a MATCH 'thread*'; +} + +do_catchsql_test 17.2 { + DROP TABLE IF EXISTS t1; +} {1 {SQL logic error}} + +do_execsql_test 17.3 { + INSERT INTO t1(t1) VALUES('optimize'); +} + +do_catchsql_test 17.4 { + DROP TABLE IF EXISTS t1; +} {1 {SQL logic error}} + +#------------------------------------------------------------------------- +reset_db +do_test 18.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 32768 pagesize 4096 filename crash-4ce32d0608aff1.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 07 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 0d a4 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 62 2c 72 6f 6f 74 ock INTEGEb,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 31 43 52 ...._tablet1t1CR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e .COMPILER=gcc-5. +| 2912: 34 23 00 20 32 30 31 36 30 36 30 39 20 44 45 42 4#. 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 53 49 4d 18 1b 05 00 25 00000XRTSIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 52 4c 45 20 4a 53 4f ...%..ENARLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 1e 4c NARY....)..ENA.L +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 55 ....)..ENABLE GU +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4e 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c NARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 59 e5 58 .#..ENABLE FTY.X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 ..#..ENABLE FTS5 +| 3792: 58 4e 4f 43 40 53 45 16 0a 05 00 23 0f 17 45 4e XNOC@SE....#..EN +| 3808: 41 42 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ABLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 05 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 25 75 2e 34 2f 30 20 32 30 31 36 30 36 30 cc%u.4/0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 41 00 04 6c 6f 61 64 03 25 1c 00 n1.%.A..load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 56 65 03 %....threadsaVe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 02 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 f2 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 57 02 00 .............W.. +| 3504: 01 02 00 01 01 00 01 02 00 11 02 00 01 02 10 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 64 6e 73 69 6f .........xtdnsio +| 3552: 6e 09 1f 04 00 01 04 00 01 03 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 57 63 63 09 01 03 ..........Wcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 02 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 03 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 02 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4064: 00 00 00 00 00 0d 05 02 23 61 75 74 6f 6d 65 72 ........#automer +| 4080: 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 3d 31 30 ge=5...#merge=10 +| page 8 offset 28672 +| 0: 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 69 74 79 0,8...+integrity +| 16: 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 75 69 6c -check....rebuil +| 32: 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 00 00 00 d....optimize... +| end crash-4ce32d0608aff1.db +}]} {} + +do_catchsql_test 18.1 { + SELECT quote(matchinfo(t1,'pcxybs'))==0 FROM t1 WHERE b MATCH 'e*'; +} {0 0} + +#------------------------------------------------------------------------- +reset_db +do_test 19.0 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 28672 pagesize 4096 filename crash-526ea445f41c02.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 07 .....@ ........ +| 32: 00 00 00 02 00 00 00 01 00 00 00 07 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e b1 00 06 0d a4 00 0f 8d 0f 21 ...............! +| 112: 0e b9 0d c8 0e 7e 0d a4 00 00 00 00 00 00 00 00 .....~.......... +| 3488: 00 00 00 00 22 07 06 17 11 11 01 31 74 61 62 6c ...........1tabl +| 3504: 65 74 32 74 32 07 43 52 45 41 54 45 20 54 41 42 et2t2.CREATE TAB +| 3520: 4c 45 20 74 32 28 78 29 81 33 05 07 17 1f 1f 01 LE t2(x).3...... +| 3536: 82 35 74 61 62 6c 65 74 31 5f 73 65 67 64 69 72 .5tablet1_segdir +| 3552: 74 31 5f 73 65 67 64 69 72 05 43 52 45 41 54 45 t1_segdir.CREATE +| 3568: 20 54 41 42 4c 45 20 27 74 31 5f 73 65 67 64 69 TABLE 't1_segdi +| 3584: 72 27 28 6c 65 76 65 6c 20 49 4e 54 45 47 45 52 r'(level INTEGER +| 3600: 2c 69 64 78 20 49 4e 54 45 47 45 52 2c 73 74 61 ,idx INTEGER,sta +| 3616: 72 74 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 52 rt_block INTEGER +| 3632: 2c 6c 65 61 76 65 73 5f 65 6e 64 5f 62 6c 6f 63 ,leaves_end_bloc +| 3648: 6b 20 49 4e 54 45 47 45 52 2c 65 6e 64 5f 62 6c k INTEGER,end_bl +| 3664: 6f 63 6b 20 49 4e 54 45 47 45 52 2c 72 6f 6f 74 ock INTEGER,root +| 3680: 20 42 4c 4f 42 2c 50 52 49 4d 41 52 59 20 4b 45 BLOB,PRIMARY KE +| 3696: 59 28 6c 65 76 65 6c 2c 20 69 64 78 29 29 31 06 Y(level, idx))1. +| 3712: 06 17 45 1f 01 00 69 6e 64 65 78 73 71 6c 69 74 ..E...indexsqlit +| 3728: 65 5f 61 75 74 6f 69 6e 64 65 78 5f 74 31 5f 73 e_autoindex_t1_s +| 3744: 65 67 64 69 72 5f 31 74 31 5f 73 65 67 64 69 72 egdir_1t1_segdir +| 3760: 06 0f c7 00 08 00 00 00 00 66 04 07 17 23 23 01 .........f...##. +| 3776: 81 13 74 61 62 6c 65 74 31 5f 73 65 67 6d 65 6e ..tablet1_segmen +| 3792: 74 73 74 31 5f 73 65 67 6d 65 6e 74 73 04 43 52 tst1_segments.CR +| 3808: 45 41 54 45 20 54 41 42 4c 45 20 27 74 31 5f 73 EATE TABLE 't1_s +| 3824: 65 67 6d 65 6e 74 73 27 28 62 6c 6f 63 6b 69 64 egments'(blockid +| 3840: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 INTEGER PRIMARY +| 3856: 20 4b 45 59 2c 20 62 6c 6f 63 6b 20 42 4c 4f 42 KEY, block BLOB +| 3872: 29 6a 03 07 17 21 21 01 81 1f 74 61 62 6c 65 74 )j...!!...tablet +| 3888: 31 5f 63 6f 6e 74 65 6e 74 74 31 5f 63 6f 6e 74 1_contentt1_cont +| 3904: 65 6e 74 03 43 52 45 41 54 45 20 54 41 42 4c 45 ent.CREATE TABLE +| 3920: 20 27 74 31 5f 63 6f 6e 74 65 6e 74 27 28 64 6f 't1_content'(do +| 3936: 63 69 64 20 49 4e 54 45 47 45 52 20 50 52 49 4d cid INTEGER PRIM +| 3952: 41 52 59 20 4b 45 59 2c 20 27 63 30 61 27 2c 20 ARY KEY, 'c0a', +| 3968: 27 63 31 62 27 2c 20 27 63 32 63 27 29 38 02 06 'c1b', 'c2c')8.. +| 3984: 17 11 11 08 5f 74 61 62 6c 65 74 31 74 41 43 52 ...._tablet1tACR +| 4000: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4016: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| 4032: 28 61 2c 62 2c 63 29 00 00 00 39 00 00 00 00 00 (a,b,c)...9..... +| page 3 offset 8192 +| 0: 0d 00 00 00 25 0b 48 00 0f d8 0f af 0f 86 0f 74 ....%.H........t +| 16: 0f 61 0f 4e 0f 2f 0f 0f 0e ef 0e d7 0e be 0e a5 .a.N./.......... +| 32: 0e 8d 0e 74 0e 5b 0e 40 0e 24 0e 08 0d ef 0d d5 ...t.[.@.$...... +| 48: 0d bb 0d a0 0d 84 0d 68 0d 4f 0d 35 0d 1b 0c fb .......h.O.5.... +| 64: 0c da 0c b9 0c 99 0c 78 0c 57 0c 3e 0c 24 0c 0a .......x.W.>.$.. +| 80: 0b 48 00 00 00 00 00 00 00 00 00 00 00 00 00 00 .H.............. +| 2880: 00 00 00 00 00 00 00 00 81 3f 25 06 00 82 7f 00 .........?%..... +| 2896: 00 43 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2f .COMPILER=gcc-5/ +| 2912: 34 2e 30 20 32 30 31 36 30 36 30 39 20 44 45 42 4.0 20160609 DEB +| 2928: 55 47 20 45 4e 41 42 4c 45 20 44 42 53 54 41 54 UG ENABLE DBSTAT +| 2944: 20 56 54 41 42 20 45 4e 41 42 4c 45 20 46 54 53 VTAB ENABLE FTS +| 2960: 34 20 45 4e 41 42 4c 45 20 46 54 53 35 20 45 4e 4 ENABLE FTS5 EN +| 2976: 41 42 4c 45 20 47 45 4f 50 4f 4c 59 20 45 4e 41 ABLE GEOPOLY ENA +| 2992: 42 4c 45 20 4a 53 4f 4e 31 20 45 4e 41 42 4c 45 BLE JSON1 ENABLE +| 3008: 20 4d 45 4d 53 59 53 35 20 45 4e 41 42 4c 45 20 MEMSYS5 ENABLE +| 3024: 52 54 52 45 45 20 4d 41 58 20 4d 45 4d 4f 52 59 RTREE MAX MEMORY +| 3040: 3d 35 30 30 30 30 30 30 30 20 4f 4d 49 54 20 4c =50000000 OMIT L +| 3056: 4f 41 44 20 45 58 54 45 4e 53 49 4f 4e 20 54 48 OAD EXTENSION TH +| 3072: 52 45 41 44 53 41 46 45 3d 30 18 24 05 00 25 0f READSAFE=0.$..%. +| 3088: 19 54 48 52 45 41 44 53 41 46 45 3d 30 58 42 49 .THREADSAFE=0XBI +| 3104: 4e 41 52 59 18 23 05 00 25 0f 19 54 48 52 45 41 NARY.#..%..THREA +| 3120: 44 53 41 46 45 3d 30 58 4e 4f 43 41 53 45 17 22 DSAFE=0XNOCASE.. +| 3136: 05 00 25 0f 17 54 48 52 45 41 44 53 41 46 45 3d ..%..THREADSAFE= +| 3152: 30 58 52 54 52 49 4d 1f 21 05 00 33 0f 19 4f 4d 0XRTRIM.!..3..OM +| 3168: 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 4f IT LOAD EXTENSIO +| 3184: 4e 58 42 49 4e 41 52 59 1f 20 05 00 33 0f 19 4f NXBINARY. ..3..O +| 3200: 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 49 MIT LOAD EXTENSI +| 3216: 4f 4e 58 4e 4f 43 41 53 45 1e 1f 05 00 33 0f 17 ONXNOCASE....3.. +| 3232: 4f 4d 49 54 20 4c 4f 41 44 20 45 58 54 45 4e 53 OMIT LOAD EXTENS +| 3248: 49 4f 4e 58 52 54 52 49 4d 1f 1e 05 00 33 0f 19 IONXRTRIM....3.. +| 3264: 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 30 MAX MEMORY=50000 +| 3280: 30 30 30 58 42 49 4e 41 52 59 1f 1d 05 00 33 0f 000XBINARY....3. +| 3296: 19 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 30 .MAX MEMORY=5000 +| 3312: 30 30 30 30 58 4e 4f 43 41 53 45 1e 1c 05 00 33 0000XNOCASE....3 +| 3328: 0f 17 4d 41 58 20 4d 45 4d 4f 52 59 3d 35 30 30 ..MAX MEMORY=500 +| 3344: 30 30 30 30 30 58 52 54 52 49 4d 18 1b 05 00 25 00000XRTRIM....% +| 3360: 0f 19 45 4e 41 42 4c 45 20 52 54 52 45 45 58 42 ..ENABLE RTREEXB +| 3376: 49 4e 41 52 59 18 1a 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3392: 4c 45 20 52 54 52 45 45 58 4e 4f 43 41 53 45 17 LE RTREEXNOCASE. +| 3408: 19 05 00 25 0f 17 45 4e 41 42 4c 45 20 52 54 52 ...%..ENABLE RTR +| 3424: 45 45 58 52 54 52 49 4d 1a 18 05 00 29 0f 19 45 EEXRTRIM....)..E +| 3440: 4e 41 42 4c 45 20 4d 45 4d 53 59 53 35 58 42 49 NABLE MEMSYS5XBI +| 3456: 4e 41 52 59 1a 17 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3472: 45 20 4d 45 4d 53 59 53 35 58 4e 4f 43 41 53 45 E MEMSYS5XNOCASE +| 3488: 19 16 05 00 29 0f 17 45 4e 41 42 4c 45 20 4d 45 ....)..ENABLE ME +| 3504: 4d 53 59 53 35 58 52 54 52 49 4d 18 15 05 00 25 MSYS5XRTRIM....% +| 3520: 0f 19 45 4e 41 42 4c 45 20 4a 53 4f 4e 31 58 42 ..ENABLE JSON1XB +| 3536: 49 4e 41 52 59 18 14 05 00 25 0f 19 45 4e 41 42 INARY....%..ENAB +| 3552: 4c 45 20 4a 53 4f 4e 31 58 4e 4f 43 41 53 45 17 LE JSON1XNOCASE. +| 3568: 13 05 00 25 0f 17 45 4e 41 42 4c 45 20 4a 53 4f ...%..ENABLE JSO +| 3584: 4e 31 58 52 54 52 49 4d 1a 12 05 00 29 0f 19 45 N1XRTRIM....)..E +| 3600: 4e 41 42 4c 45 20 47 45 4f 50 4f 4c 59 58 42 49 NABLE GEOPOLYXBI +| 3616: 4e 41 52 59 1a 11 05 00 29 0f 19 45 4e 41 42 4c NARY....)..ENABL +| 3632: 45 20 47 45 4f 50 4f 4c 59 58 4e 4f 43 41 53 45 E GEOPOLYXNOCASE +| 3648: 19 10 05 00 29 0f 17 45 4e 41 42 4c 45 20 47 45 ....)..ENABLE GE +| 3664: 4f 50 4f 4c 59 58 52 54 52 49 4d 17 0f 05 00 23 OPOLYXRTRIM....# +| 3680: 0f 19 45 4e 41 42 4c 45 20 46 54 53 35 58 42 49 ..ENABLE FTS5XBI +| 3696: 4f 41 52 59 17 0e 05 00 23 0f 19 45 4e 41 42 4c OARY....#..ENABL +| 3712: 45 20 46 54 53 35 58 4e 4f 43 41 53 45 16 0d 05 E FTS5XNOCASE... +| 3728: 00 23 0f 17 45 4e 41 42 4c 45 20 46 54 53 35 58 .#..ENABLE FTS5X +| 3744: 52 54 52 49 4d 17 0c 05 00 23 0f 19 45 4e 41 42 RTRIM....#..ENAB +| 3760: 4c 45 20 46 54 53 34 58 42 49 4e 41 52 59 17 0b LE FTS4XBINARY.. +| 3776: 05 00 23 0f 19 45 4e 41 42 4d f5 20 46 54 53 34 ..#..ENABM. FTS4 +| 3792: 58 4e 4f 43 41 53 45 16 0a 05 00 23 0f 17 45 4e XNOCASE....#..EN +| 3808: 41 52 4c 45 20 46 54 53 34 58 52 54 52 49 4d 1e ARLE FTS4XRTRIM. +| 3824: 09 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3840: 54 41 54 20 56 54 41 42 58 42 49 4e 41 52 59 1e TAT VTABXBINARY. +| 3856: 08 05 00 31 0f 19 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3872: 54 41 54 20 56 54 41 42 58 4e 4f 43 41 53 45 1d TAT VTABXNOCASE. +| 3888: 07 05 00 31 0f 17 45 4e 41 42 4c 45 20 44 42 53 ...1..ENABLE DBS +| 3904: 54 41 54 20 56 54 41 42 58 52 54 52 49 4d 11 06 TAT VTABXRTRIM.. +| 3920: 05 00 17 0f 19 44 45 42 55 47 58 42 49 4e 41 52 .....DEBUGXBINAR +| 3936: 59 11 05 05 00 17 0f 19 44 45 42 55 47 58 4e 4f Y.......DEBUGXNO +| 3952: 43 41 53 45 10 04 05 00 17 0f 17 44 45 42 55 47 CASE.......DEBUG +| 3968: 58 52 54 52 49 4d 27 03 05 00 43 0f 19 43 4f 4d XRTRIM'...C..COM +| 3984: 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e 30 20 PILER=gcc-5.4.0 +| 4000: 32 30 31 36 30 36 30 39 58 42 49 4e 41 52 59 27 20160609XBINARY' +| 4016: 02 04 00 43 0f 19 43 4f 4d 50 49 4c 45 52 3d 67 ...C..COMPILER=g +| 4032: 63 63 2d 35 2e 34 2e 30 20 32 30 31 36 30 36 30 cc-5.4.0 2016060 +| 4048: 39 58 4e 4f 43 41 53 45 26 01 05 00 43 0f 17 43 9XNOCASE&...C..C +| 4064: 4f 4d 50 49 4c 45 52 3d 67 63 63 2d 35 2e 34 2e OMPILER=gcc-5.4. +| 4080: 30 20 32 30 31 36 30 36 30 39 58 52 54 52 49 4d 0 20160609XRTRIM +| page 4 offset 12288 +| 0: 0d 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| page 5 offset 16384 +| 0: 0d 00 00 00 02 0b a0 00 0c ad 0b a0 00 00 00 00 ................ +| 2976: 82 0a 02 08 08 09 08 08 17 84 06 30 20 32 35 33 ...........0 253 +| 2992: 00 01 30 04 25 06 1b 00 00 08 32 30 31 36 30 36 ..0.%.....201606 +| 3008: 30 39 03 25 07 00 00 01 34 03 25 05 00 00 01 35 09.%....4.%....5 +| 3024: 03 25 04 00 01 07 30 30 30 30 30 30 30 03 25 1a .%....0000000.%. +| 3040: 00 00 08 63 6f 6d 70 69 6c 65 72 03 25 02 00 00 ...compiler.%... +| 3056: 06 64 62 73 74 61 74 03 25 0a 00 01 04 65 62 75 .dbstat.%....ebu +| 3072: 67 03 25 08 00 00 06 65 6e 61 62 6c 65 09 25 09 g.%....enable.%. +| 3088: 05 04 04 04 04 04 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3104: 6e 03 25 1d 00 00 04 66 74 73 34 03 25 0d 00 03 n.%....fts4.%... +| 3120: 01 35 03 25 0f 00 00 03 67 63 63 03 25 03 00 01 .5.%....gcc.%... +| 3136: 06 65 6f 70 6f 6c 79 03 25 11 00 00 05 6a 73 6f .eopoly.%....jso +| 3152: 6e 31 03 25 13 00 00 04 6c 6f 61 64 03 25 1c 00 n1.%....load.%.. +| 3168: 00 03 6d 61 78 03 25 18 00 01 05 65 6d 6f 72 79 ..max.%....emory +| 3184: 03 25 19 00 03 04 73 79 73 35 03 25 15 00 00 04 .%....sys5.%.... +| 3200: 6f 6d 69 74 03 25 1b 00 00 05 72 74 72 65 65 03 omit.%....rtree. +| 3216: 25 17 00 00 0a 74 68 72 65 61 64 73 61 66 65 03 %....threadsafe. +| 3232: 25 1e 00 00 04 76 74 61 62 03 25 0b 00 86 50 01 %....vtab.%...P. +| 3248: 08 08 08 08 08 17 8d 12 30 20 38 33 35 00 01 30 ........0 835..0 +| 3264: 12 01 06 00 01 06 00 01 06 00 1f 03 00 01 03 00 ................ +| 3280: 01 03 00 00 08 32 30 31 36 30 36 30 39 09 01 07 .....20160609... +| 3296: 00 01 07 00 01 07 00 00 01 34 09 01 05 00 01 05 .........4...... +| 3312: 00 01 05 00 00 01 35 09 01 04 00 01 04 00 01 04 ......5......... +| 3328: 00 01 07 30 30 30 30 30 30 30 09 1c 04 00 01 04 ...0000000...... +| 3344: 00 01 04 00 00 06 62 69 6e 61 72 79 3c 03 01 02 ......binary<... +| 3360: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3376: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3392: 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 ................ +| 3408: 01 02 02 00 03 01 02 02 00 00 08 63 6f 6d 70 69 ...........compi +| 3424: 6c 65 72 09 01 02 00 01 02 00 01 02 00 00 06 64 ler............d +| 3440: 62 73 74 61 74 09 07 03 00 01 03 00 01 03 00 01 bstat........... +| 3456: 04 65 62 75 67 09 04 02 00 01 02 00 01 02 00 00 .ebug........... +| 3472: 06 65 6e 61 62 6c 65 3f 07 02 00 01 02 00 01 02 .enable?........ +| 3488: 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 ................ +| 3504: 01 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 ................ +| 3520: 02 00 01 02 00 01 02 00 01 02 00 01 02 00 01 02 ................ +| 3536: 00 01 02 00 01 02 00 01 08 78 74 65 6e 73 69 6f .........xtensio +| 3552: 6e 09 1f 04 00 01 04 00 01 04 00 00 04 66 74 73 n............fts +| 3568: 34 09 0a 03 00 01 03 00 01 03 00 03 01 35 09 0d 4............5.. +| 3584: 03 00 01 03 00 01 03 00 00 03 67 63 63 09 01 03 ..........gcc... +| 3600: 00 01 03 00 01 03 00 01 06 65 6f 70 6f 6c 79 09 .........eopoly. +| 3616: 10 03 00 01 03 00 01 03 00 00 05 6a 73 6f 6e 31 ...........json1 +| 3632: 09 13 03 00 01 03 00 01 03 00 00 04 6c 6f 61 64 ............load +| 3648: 09 1f 03 00 01 03 00 01 03 00 00 03 6d 61 78 09 ............max. +| 3664: 1c 02 00 01 02 00 01 02 00 01 05 65 6d 6f 72 79 ...........emory +| 3680: 09 1c 03 00 01 03 00 01 03 00 03 04 73 79 73 35 ............sys5 +| 3696: 09 16 03 00 01 03 00 01 03 00 00 06 6e 6f 63 61 ............noca +| 3712: 73 65 3c 02 01 02 02 00 03 01 02 02 00 03 01 02 se<............. +| 3728: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3744: 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 00 ................ +| 3760: 03 01 02 02 00 13 01 02 02 00 03 01 02 02 00 00 ................ +| 3776: 04 6f 6d 69 74 09 1f 02 00 01 12 00 01 02 00 00 .omit........... +| 3792: 05 72 74 72 65 65 09 19 03 00 01 81 00 01 03 00 .rtree.......... +| 3808: 03 02 69 6d 3c 01 01 02 02 00 03 01 02 02 00 03 ..im<........... +| 3824: 01 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 ................ +| 3840: 02 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 ................ +| 3856: 02 00 03 01 02 02 00 03 01 02 02 00 03 01 02 02 ................ +| 3872: 00 00 0a 74 68 72 65 61 64 73 61 66 65 09 22 02 ...threadsafe... +| 3888: 00 01 02 00 01 02 00 00 04 76 74 61 62 09 07 04 .........vtab... +| 3904: 00 01 04 00 01 04 00 00 01 78 b4 01 01 01 01 02 .........x...... +| 3920: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 3936: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 3952: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 3968: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 3984: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4000: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| 4016: 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 ................ +| 4032: 01 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 ................ +| 4048: 01 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 ................ +| 4064: 02 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 ................ +| 4080: 00 01 01 01 02 00 01 01 01 02 00 01 01 01 02 00 ................ +| page 6 offset 20480 +| 0: 0a 00 00 00 02 0f f5 00 0f fb 0f f5 00 00 00 00 ................ +| 4080: 00 00 00 00 00 05 04 08 09 01 02 04 04 08 08 09 ................ +| page 7 offset 24576 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 2d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity-check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end crash-526ea445f41c02.db +}]} {} + +do_catchsql_test 19.1 { + SELECT rowid,a,c,snippet(t1,85101090932165,-1,10) FROM t1 WHERE a MATCH 'rtree'; +} {1 {database disk image is malformed}} + finish_test + diff --git a/test/fts3expr5.test b/test/fts3expr5.test index 1e09851..8673abb 100644 --- a/test/fts3expr5.test +++ b/test/fts3expr5.test @@ -22,6 +22,10 @@ ifcapable !fts3 { return } +proc test_fts3expr {expr} { + db one {SELECT fts3_exprtest('simple', $expr, 'a', 'b', 'c')} +} + #------------------------------------------------------------------------- # Various forms of empty phrase expressions. # @@ -45,4 +49,19 @@ do_execsql_test 1.5 { SELECT rowid FROM t0 WHERE x MATCH '""""'; } {} +#------------------------------------------------------------------------- +# Various forms of empty phrase expressions. +# +set sqlite_fts3_enable_parentheses 1 +do_test 2.0 { + test_fts3expr {(a:123)(b:234)()(c:456)} +} {AND {AND {PHRASE 0 0 123} {PHRASE 1 0 234}} {PHRASE 2 0 456}} +do_test 2.1 { + test_fts3expr {(a:123)(b:234)(c:456)} +} {AND {AND {PHRASE 0 0 123} {PHRASE 1 0 234}} {PHRASE 2 0 456}} +do_test 2.2 { + list [catch { test_fts3expr {"123" AND ( )} } msg] $msg +} {1 {Error parsing expression}} + finish_test + diff --git a/test/fts3fault.test b/test/fts3fault.test index 996a108..707e884 100644 --- a/test/fts3fault.test +++ b/test/fts3fault.test @@ -240,4 +240,20 @@ do_faultsim_test 10.1 -prep { faultsim_test_result {0 {}} } +#------------------------------------------------------------------------- +reset_db +do_execsql_test 11.0 { + CREATE VIRTUAL TABLE t1 USING fts3(a, b); +} +faultsim_save_and_close + +do_faultsim_test 11 -faults oom* -prep { + faultsim_restore_and_reopen +} -body { + execsql { DROP TABLE t1 } +} -test { + faultsim_test_result {0 {}} +} + + finish_test diff --git a/test/fts3fuzz001.test b/test/fts3fuzz001.test new file mode 100644 index 0000000..41b22d3 --- /dev/null +++ b/test/fts3fuzz001.test @@ -0,0 +1,114 @@ +# 2012-12-21 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Test cases for corrupt database files. + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +ifcapable !deserialize||!fts3 { + finish_test + return +} +database_may_be_corrupt + +do_test fts3fuzz001-100 { + sqlite3 db {} + db deserialize [decode_hexdb { +| size 24576 pagesize 4096 filename c6.db +| page 1 offset 0 +| 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. +| 16: 10 00 01 01 00 40 20 20 00 00 00 00 00 00 00 06 .....@ ........ +| 32: 00 00 00 00 00 00 00 00 00 00 00 05 00 00 00 04 ................ +| 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ +| 96: 00 00 00 00 0d 0e f9 00 06 0d ec 00 0f cd 0f 69 ...............i +| 112: 0f 01 0e 10 0e c6 0d ec 00 00 00 00 00 00 00 00 ................ +| 3552: 00 00 00 00 00 00 00 00 00 00 00 00 22 06 06 17 ............"... +| 3568: 11 11 01 31 74 61 62 6c 65 74 32 74 32 06 43 52 ...1tablet2t2.CR +| 3584: 45 41 54 45 20 54 41 42 4c 45 20 74 32 28 78 29 EATE TABLE t2(x) +| 3600: 81 33 04 07 17 1f 1f 01 82 35 74 61 62 6c 65 74 .3.......5tablet +| 3616: 31 5f 73 65 67 64 69 72 74 31 5f 73 65 67 64 69 1_segdirt1_segdi +| 3632: 72 04 43 52 45 41 54 45 20 54 41 42 4c 45 20 27 r.CREATE TABLE ' +| 3648: 74 31 5f 73 65 67 64 69 72 27 28 6c 65 76 65 6c t1_segdir'(level +| 3664: 20 49 4e 54 45 47 45 52 2c 69 64 78 20 49 4e 54 INTEGER,idx INT +| 3680: 45 47 45 52 2c 73 74 61 72 74 5f 62 6c 6f 63 6b EGER,start_block +| 3696: 20 49 4e 54 45 47 45 52 2c 6c 65 61 76 65 73 5f INTEGER,leaves_ +| 3712: 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 47 45 end_block INTEGE +| 3728: 52 2c 65 6e 64 5f 62 6c 6f 63 6b 20 49 4e 54 45 R,end_block INTE +| 3744: 47 45 52 2c 72 6f 6f 74 20 42 4c 4f 42 2c 50 52 GER,root BLOB,PR +| 3760: 49 4d 41 52 59 20 4b 45 59 28 6c 65 76 65 6c 2c IMARY KEY(level, +| 3776: 20 69 64 78 29 29 31 05 06 17 45 1f 01 00 69 6e idx))1...E...in +| 3792: 64 65 78 73 71 6c 69 74 65 5f 61 75 74 6f 69 6e dexsqlite_autoin +| 3808: 64 65 78 5f 74 15 f7 36 56 76 46 97 25 f3 17 43 dex_t..6VvF.%..C +| 3824: 15 5f 73 65 67 64 69 72 05 00 00 00 08 00 00 00 ._segdir........ +| 3840: 00 66 03 07 17 23 23 01 81 13 74 61 62 6c 65 74 .f...##...tablet +| 3856: 31 5f 73 65 67 6d 65 6e 74 73 74 31 5f 73 65 67 1_segmentst1_seg +| 3872: 6d 65 6e 74 73 03 43 52 45 41 54 45 20 54 41 42 ments.CREATE TAB +| 3888: 4c 45 20 27 74 31 5f 73 65 67 6d 65 6e 74 73 27 LE 't1_segments' +| 3904: 28 62 6c 6f 63 6b 69 64 20 49 4e 54 45 47 45 52 (blockid INTEGER +| 3920: 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 62 6c PRIMARY KEY, bl +| 3936: 6f 63 6b 20 42 4c 4f 42 29 62 02 07 17 21 21 01 ock BLOB)b...!!. +| 3952: 81 0f 74 61 62 6c 65 74 31 5f 63 6f 6e 74 65 6e ..tablet1_conten +| 3968: 74 74 31 5f 63 6f 6e 74 65 6e 74 02 43 52 45 41 tt1_content.CREA +| 3984: 54 45 20 54 41 42 4c 45 20 27 74 31 5f 63 6f 6e TE TABLE 't1_con +| 4000: 74 65 6e 74 27 28 64 6f 63 69 64 20 49 4e 54 45 tent'(docid INTE +| 4016: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c GER PRIMARY KEY, +| 4032: 20 27 63 30 63 6f 6e 74 65 6e 74 27 29 31 01 06 'c0content')1.. +| 4048: 17 11 11 08 51 74 61 62 6c 65 74 31 74 31 43 52 ....Qtablet1t1CR +| 4064: 45 41 54 45 20 56 49 52 54 55 41 4c 20 54 41 42 EATE VIRTUAL TAB +| 4080: 4c 45 20 74 31 20 55 53 49 4e 47 20 66 74 73 33 LE t1 USING fts3 +| page 2 offset 4096 +| 0: 0d 00 00 00 03 0f e0 00 0f f6 0f ec 0f e0 00 00 ................ +| 4064: 0a 03 03 00 1b 61 62 61 6e 64 6f 6e 08 02 03 00 .....abandon.... +| 4080: 17 61 62 61 66 74 08 01 03 00 17 61 62 61 63 6b .abaft.....aback +| page 3 offset 8192 +| 0: 0d 00 00 00 00 10 00 00 00 00 00 00 00 00 00 00 ................ +| page 4 offset 12288 +| 0: 0d 00 00 00 01 0f d6 00 0f 00 00 00 00 00 00 00 ................ +| 4048: 00 00 00 00 00 00 28 01 07 08 08 08 08 15 46 30 ......(.......F0 +| 4064: 20 32 39 00 05 61 62 61 63 6b 03 01 02 00 03 02 29..aback...... +| 4080: 66 74 03 02 02 00 03 04 6e 64 6f 6e 03 03 02 00 ft......ndon.... +| page 5 offset 16384 +| 0: 0a 00 00 00 01 0f fb 00 0f fb 00 00 00 00 00 00 ................ +| 4080: 00 00 00 00 00 00 00 00 00 00 00 04 04 08 08 09 ................ +| page 6 offset 20480 +| 0: 0d 00 00 00 05 0f b8 00 0f f4 0f e9 0f d6 0f c7 ................ +| 16: 0f b8 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................ +| 4016: 00 00 00 00 00 00 00 00 0d 05 02 23 61 75 74 6f ...........#auto +| 4032: 6d 65 72 67 65 3d 35 0d 04 02 23 6d 65 72 67 65 merge=5...#merge +| 4048: 3d 31 30 30 2c 38 11 03 02 2b 69 6e 74 65 67 72 =100,8...+integr +| 4064: 69 74 79 3d 63 68 65 63 6b 09 02 02 1b 72 65 62 ity=check....reb +| 4080: 75 69 6c 64 0a 01 02 1d 6f 70 74 69 6d 69 7a 65 uild....optimize +| end c6.db + }] + catchsql { + PRAGMA writable_schema=on; -- disable schema corruption detection + INSERT INTO t1(t1) SELECT x FROM t2; + } +} {1 {database disk image is malformed}} +do_test fts3fuzz001-110 { + catchsql { + INSERT INTO t1(t1) VALUES('integrity-check'); + } +} {1 {database disk image is malformed}} +do_test fts3fuzz001-120 { + catchsql { + INSERT INTO t1(t1) VALUES('optimize'); + } +} {1 {database disk image is malformed}} +do_test fts3fuzz001-121 { + catchsql { + INSERT INTO t1(t1) VALUES('integrity-check'); + } +} {1 {database disk image is malformed}} + + +finish_test diff --git a/test/fts3snippet.test b/test/fts3snippet.test index 4a0b787..ebcdb8c 100644 --- a/test/fts3snippet.test +++ b/test/fts3snippet.test @@ -555,6 +555,11 @@ do_test 4.2 { }] } {64} +do_test 4.3 { + llength [db one { + SELECT snippet(t4, '', '', '', 0, 150) FROM t4 WHERE t4 MATCH 'E' + }] +} {64} diff --git a/test/fts4umlaut.test b/test/fts4umlaut.test new file mode 100644 index 0000000..a5a652f --- /dev/null +++ b/test/fts4umlaut.test @@ -0,0 +1,64 @@ +# 2018 December 3 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#************************************************************************* +# This file implements regression tests for SQLite library. The +# focus of this script is testing the FTS5 module. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix fts4umlaut + +ifcapable !fts3 { + finish_test + return +} + +do_execsql_test 1.0 { + CREATE VIRTUAL TABLE t1 USING fts4(x, tokenize=unicode61); + CREATE VIRTUAL TABLE t2 USING fts4( + x, + tokenize=unicode61 "remove_diacritics=2" + ); +} + +foreach {tn q res1 res2} { + 1 "Hà Nội" 0 1 + 2 "Hà Noi" 1 1 + 3 "Ha Noi" 1 1 + 4 "Ha N\u1ed9i" 0 1 + 5 "Ha N\u006fi" 1 1 + 6 "Ha N\u006f\u0302i" 1 1 + 7 "Ha N\u006f\u0323\u0302i" 1 1 +} { + do_execsql_test 1.$tn.1 { + DELETE FROM t1; + INSERT INTO t1(rowid, x) VALUES (1, 'Ha Noi'); + SELECT count(*) FROM t1 WHERE t1 MATCH $q + } $res1 + do_execsql_test 1.$tn.2 { + DELETE FROM t1; + INSERT INTO t1(rowid, x) VALUES (1, $q); + SELECT count(*) FROM t1 WHERE t1 MATCH 'Ha Noi' + } $res1 + + do_execsql_test 1.$tn.3 { + DELETE FROM t2; + INSERT INTO t2(rowid, x) VALUES (1, 'Ha Noi'); + SELECT count(*) FROM t2 WHERE t2 MATCH $q + } $res2 + do_execsql_test 1.$tn.4 { + DELETE FROM t2; + INSERT INTO t2(rowid, x) VALUES (1, $q); + SELECT count(*) FROM t2 WHERE t2 MATCH 'Ha Noi' + } $res2 +} + +finish_test diff --git a/test/fuzz4.test b/test/fuzz4.test new file mode 100644 index 0000000..821cd16 --- /dev/null +++ b/test/fuzz4.test @@ -0,0 +1,82 @@ +# 2018-12-12 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Test cases found by Matthew Denton's fuzzer at Chrome. +# + + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +do_execsql_test fuzz4-100 { + CREATE TABLE Table0 (Col0 NOT NULL DEFAULT (CURRENT_TIME IS 1 > 1)); + INSERT OR REPLACE INTO Table0 DEFAULT VALUES ; + SELECT * FROM Table0; +} {0} + +do_execsql_test fuzz4-110 { + CREATE TABLE Table1( + Col0 TEXT DEFAULT (CASE WHEN 1 IS 3530822107858468864 + THEN 1 ELSE quote(1) IS 3530822107858468864 END) + ); + INSERT INTO Table1 DEFAULT VALUES; + SELECT * FROM Table1; +} {0} + +do_execsql_test fuzz4-200 { + CREATE TABLE Table2a( + Col0 NOT NULL DEFAULT (CURRENT_TIME IS 1 IS NOT 1 > 1) + ); + INSERT OR REPLACE INTO Table2a DEFAULT VALUES; + SELECT * FROM Table2a; +} {0} + +do_execsql_test fuzz4-210 { + CREATE TABLE Table2b (Col0 NOT NULL DEFAULT (CURRENT_TIME IS NOT FALSE)) ; + INSERT OR REPLACE INTO Table2b DEFAULT VALUES ; + SELECT * FROM Table2b; +} {1} + +do_execsql_test fuzz4-300 { + CREATE TABLE Table3 (Col0 DEFAULT (CURRENT_TIMESTAMP BETWEEN 1 AND 1)); + INSERT INTO Table3 DEFAULT VALUES; + SELECT * FROM Table3; +} {0} + +do_execsql_test fuzz4-400 { + CREATE TABLE Table4 (Col0 DEFAULT (1 BETWEEN CURRENT_TIMESTAMP AND 1)); + INSERT INTO Table4 DEFAULT VALUES; + SELECT * FROM Table4; +} {0} + +do_execsql_test fuzz4-500 { + CREATE TABLE Table5 (Col0 DEFAULT (1 BETWEEN 1 AND CURRENT_TIMESTAMP)); + INSERT INTO Table5 DEFAULT VALUES; + SELECT * FROM Table5; +} {1} + +do_execsql_test fuzz4-600 { + CREATE TEMPORARY TABLE Table6( + Col0 DEFAULT (CASE x'5d' WHEN 1 THEN + CASE CURRENT_TIMESTAMP WHEN 1 THEN 1 ELSE 1 END + ELSE CASE WHEN 1 THEN FALSE END END ) + ); + INSERT INTO temp.Table6 DEFAULT VALUES ; + SELECT * FROM Table6; +} {0} +do_execsql_test fuzz4-610 { + WITH TableX AS (SELECT DISTINCT * ORDER BY 1 , 1 COLLATE RTRIM) + DELETE FROM Table6 WHERE Col0 || +8388608 ; + SELECT * FROM Table6; +} {} + + +finish_test diff --git a/test/fuzzcheck.c b/test/fuzzcheck.c index 005f59b..80397ba 100644 --- a/test/fuzzcheck.c +++ b/test/fuzzcheck.c @@ -69,6 +69,7 @@ #include #include #include +#include #include "sqlite3.h" #define ISSPACE(X) isspace((unsigned char)(X)) #define ISDIGIT(X) isdigit((unsigned char)(X)) @@ -400,7 +401,6 @@ static void blobListFree(Blob *p){ } } - /* Return the current wall-clock time */ static sqlite3_int64 timeOfDay(void){ static sqlite3_vfs *clockVfs = 0; @@ -419,6 +419,469 @@ static sqlite3_int64 timeOfDay(void){ return t; } +/*************************************************************************** +** Code to process combined database+SQL scripts generated by the +** dbsqlfuzz fuzzer. +*/ + +/* An instance of the following object is passed by pointer as the +** client data to various callbacks. +*/ +typedef struct FuzzCtx { + sqlite3 *db; /* The database connection */ + sqlite3_int64 iCutoffTime; /* Stop processing at this time. */ + sqlite3_int64 iLastCb; /* Time recorded for previous progress callback */ + sqlite3_int64 mxInterval; /* Longest interval between two progress calls */ + unsigned nCb; /* Number of progress callbacks */ + unsigned mxCb; /* Maximum number of progress callbacks allowed */ + unsigned execCnt; /* Number of calls to the sqlite3_exec callback */ + int timeoutHit; /* True when reaching a timeout */ +} FuzzCtx; + +/* Verbosity level for the dbsqlfuzz test runner */ +static int eVerbosity = 0; + +/* True to activate PRAGMA vdbe_debug=on */ +static int bVdbeDebug = 0; + +/* Timeout for each fuzzing attempt, in milliseconds */ +static int giTimeout = 10000; /* Defaults to 10 seconds */ + +/* Maximum number of progress handler callbacks */ +static unsigned int mxProgressCb = 2000; + +/* Maximum string length in SQLite */ +static int lengthLimit = 1000000; + +/* Maximum byte-code program length in SQLite */ +static int vdbeOpLimit = 25000; + +/* Maximum size of the in-memory database */ +static sqlite3_int64 maxDbSize = 104857600; + +/* +** Translate a single byte of Hex into an integer. +** This routine only works if h really is a valid hexadecimal +** character: 0..9a..fA..F +*/ +static unsigned char hexToInt(unsigned int h){ +#ifdef SQLITE_EBCDIC + h += 9*(1&~(h>>4)); /* EBCDIC */ +#else + h += 9*(1&(h>>6)); /* ASCII */ +#endif + return h & 0xf; +} + +/* +** The first character of buffer zIn[0..nIn-1] is a '['. This routine +** checked to see if the buffer holds "[NNNN]" or "[+NNNN]" and if it +** does it makes corresponding changes to the *pK value and *pI value +** and returns true. If the input buffer does not match the patterns, +** no changes are made to either *pK or *pI and this routine returns false. +*/ +static int isOffset( + const unsigned char *zIn, /* Text input */ + int nIn, /* Bytes of input */ + unsigned int *pK, /* half-byte cursor to adjust */ + unsigned int *pI /* Input index to adjust */ +){ + int i; + unsigned int k = 0; + unsigned char c; + for(i=1; i=nAlloc ){ + sqlite3_uint64 newSize; + if( nAlloc==MX_FILE_SZ || j>=MX_FILE_SZ ){ + if( eVerbosity ){ + fprintf(stderr, "Input database too big: max %d bytes\n", + MX_FILE_SZ); + } + sqlite3_free(a); + return -1; + } + newSize = nAlloc*2; + if( newSize<=j ){ + newSize = (j+4096)&~4095; + } + if( newSize>MX_FILE_SZ ){ + if( j>=MX_FILE_SZ ){ + sqlite3_free(a); + return -1; + } + newSize = MX_FILE_SZ; + } + a = sqlite3_realloc64( a, newSize ); + if( a==0 ){ + fprintf(stderr, "Out of memory!\n"); + exit(1); + } + assert( newSize > nAlloc ); + memset(a+nAlloc, 0, newSize - nAlloc); + nAlloc = newSize; + } + if( j>=(unsigned)mx ){ + mx = (j + 4095)&~4095; + if( mx>MX_FILE_SZ ) mx = MX_FILE_SZ; + } + assert( j=p->iCutoffTime; + sqlite3_int64 iDiff = iNow - p->iLastCb; + if( iDiff > p->mxInterval ) p->mxInterval = iDiff; + p->nCb++; + if( rc==0 && p->mxCb>0 && p->mxCb<=p->nCb ) rc = 1; + if( rc && !p->timeoutHit && eVerbosity>=2 ){ + printf("Timeout on progress callback %d\n", p->nCb); + fflush(stdout); + p->timeoutHit = 1; + } + return rc; +} + +/* +** Disallow debugging pragmas such as "PRAGMA vdbe_debug" and +** "PRAGMA parser_trace" since they can dramatically increase the +** amount of output without actually testing anything useful. +** +** Also block ATTACH and DETACH +*/ +static int block_troublesome_sql( + void *Notused, + int eCode, + const char *zArg1, + const char *zArg2, + const char *zArg3, + const char *zArg4 +){ + (void)Notused; + (void)zArg2; + (void)zArg3; + (void)zArg4; + if( eCode==SQLITE_PRAGMA ){ + if( sqlite3_strnicmp("vdbe_", zArg1, 5)==0 + || sqlite3_stricmp("parser_trace", zArg1)==0 + || sqlite3_stricmp("temp_store_directory", zArg1)==0 + ){ + return SQLITE_DENY; + } + }else if( (eCode==SQLITE_ATTACH || eCode==SQLITE_DETACH) + && zArg1 && zArg1[0] ){ + return SQLITE_DENY; + } + return SQLITE_OK; +} + +/* +** Run the SQL text +*/ +static int runDbSql(sqlite3 *db, const char *zSql){ + int rc; + sqlite3_stmt *pStmt; + while( isspace(zSql[0]&0x7f) ) zSql++; + if( zSql[0]==0 ) return SQLITE_OK; + if( eVerbosity>=4 ){ + printf("RUNNING-SQL: [%s]\n", zSql); + fflush(stdout); + } + rc = sqlite3_prepare_v2(db, zSql, -1, &pStmt, 0); + if( rc==SQLITE_OK ){ + while( (rc = sqlite3_step(pStmt))==SQLITE_ROW ){ + if( eVerbosity>=5 ){ + int j; + for(j=0; j=5 ) */ + } /* End while( SQLITE_ROW */ + if( rc!=SQLITE_DONE && eVerbosity>=4 ){ + printf("SQL-ERROR: (%d) %s\n", rc, sqlite3_errmsg(db)); + fflush(stdout); + } + }else if( eVerbosity>=4 ){ + printf("SQL-ERROR (%d): %s\n", rc, sqlite3_errmsg(db)); + fflush(stdout); + } /* End if( SQLITE_OK ) */ + return sqlite3_finalize(pStmt); +} + +/* Invoke this routine to run a single test case */ +int runCombinedDbSqlInput(const uint8_t *aData, size_t nByte){ + int rc; /* SQLite API return value */ + int iSql; /* Index in aData[] of start of SQL */ + unsigned char *aDb = 0; /* Decoded database content */ + int nDb = 0; /* Size of the decoded database */ + int i; /* Loop counter */ + int j; /* Start of current SQL statement */ + char *zSql = 0; /* SQL text to run */ + int nSql; /* Bytes of SQL text */ + FuzzCtx cx; /* Fuzzing context */ + + if( nByte<10 ) return 0; + if( sqlite3_initialize() ) return 0; + if( sqlite3_memory_used()!=0 ){ + int nAlloc = 0; + int nNotUsed = 0; + sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &nAlloc, &nNotUsed, 0); + fprintf(stderr,"Memory leak in mutator: %lld bytes in %d allocations\n", + sqlite3_memory_used(), nAlloc); + exit(1); + } + memset(&cx, 0, sizeof(cx)); + iSql = decodeDatabase((unsigned char*)aData, (int)nByte, &aDb, &nDb); + if( iSql<0 ) return 0; + nSql = (int)(nByte - iSql); + if( eVerbosity>=3 ){ + printf( + "****** %d-byte input, %d-byte database, %d-byte script " + "******\n", (int)nByte, nDb, nSql); + fflush(stdout); + } + rc = sqlite3_open(0, &cx.db); + if( rc ) return 1; + if( bVdbeDebug ){ + sqlite3_exec(cx.db, "PRAGMA vdbe_debug=ON", 0, 0, 0); + } + + /* Invoke the progress handler frequently to check to see if we + ** are taking too long. The progress handler will return true + ** (which will block further processing) if more than giTimeout seconds have + ** elapsed since the start of the test. + */ + cx.iLastCb = timeOfDay(); + cx.iCutoffTime = cx.iLastCb + giTimeout; /* Now + giTimeout seconds */ + cx.mxCb = mxProgressCb; +#ifndef SQLITE_OMIT_PROGRESS_CALLBACK + sqlite3_progress_handler(cx.db, 10, progress_handler, (void*)&cx); +#endif + + /* Set a limit on the maximum size of a prepared statement, and the + ** maximum length of a string or blob */ + if( vdbeOpLimit>0 ){ + sqlite3_limit(cx.db, SQLITE_LIMIT_VDBE_OP, vdbeOpLimit); + } + if( lengthLimit>0 ){ + sqlite3_limit(cx.db, SQLITE_LIMIT_LENGTH, lengthLimit); + } + + if( nDb>=20 && aDb[18]==2 && aDb[19]==2 ){ + aDb[18] = aDb[19] = 1; + } + rc = sqlite3_deserialize(cx.db, "main", aDb, nDb, nDb, + SQLITE_DESERIALIZE_RESIZEABLE | + SQLITE_DESERIALIZE_FREEONCLOSE); + if( rc ){ + fprintf(stderr, "sqlite3_deserialize() failed with %d\n", rc); + goto testrun_finished; + } + if( maxDbSize>0 ){ + sqlite3_int64 x = maxDbSize; + sqlite3_file_control(cx.db, "main", SQLITE_FCNTL_SIZE_LIMIT, &x); + } + + /* For high debugging levels, turn on debug mode */ + if( eVerbosity>=5 ){ + sqlite3_exec(cx.db, "PRAGMA vdbe_debug=ON;", 0, 0, 0); + } + + /* Block debug pragmas and ATTACH/DETACH. But wait until after + ** deserialize to do this because deserialize depends on ATTACH */ + sqlite3_set_authorizer(cx.db, block_troublesome_sql, 0); + + /* Consistent PRNG seed */ + sqlite3_randomness(0,0); + + zSql = sqlite3_malloc( nSql + 1 ); + if( zSql==0 ){ + fprintf(stderr, "Out of memory!\n"); + }else{ + memcpy(zSql, aData+iSql, nSql); + zSql[nSql] = 0; + for(i=j=0; zSql[i]; i++){ + if( zSql[i]==';' ){ + char cSaved = zSql[i+1]; + zSql[i+1] = 0; + if( sqlite3_complete(zSql+j) ){ + rc = runDbSql(cx.db, zSql+j); + j = i+1; + } + zSql[i+1] = cSaved; + if( rc==SQLITE_INTERRUPT || progress_handler(&cx) ){ + goto testrun_finished; + } + } + } + if( j=2 ){ + fprintf(stdout, "Peak memory usages: %f MB\n", + sqlite3_memory_highwater(1) / 1000000.0); + } + if( sqlite3_memory_used()!=0 ){ + int nAlloc = 0; + int nNotUsed = 0; + sqlite3_status(SQLITE_STATUS_MALLOC_COUNT, &nAlloc, &nNotUsed, 0); + fprintf(stderr,"Memory leak: %lld bytes in %d allocations\n", + sqlite3_memory_used(), nAlloc); + exit(1); + } + return 0; +} + +/* +** END of the dbsqlfuzz code +***************************************************************************/ + +/* Look at a SQL text and try to determine if it begins with a database +** description, such as would be found in a dbsqlfuzz test case. Return +** true if this does appear to be a dbsqlfuzz test case and false otherwise. +*/ +static int isDbSql(unsigned char *a, int n){ + unsigned char buf[12]; + int i; + if( n>4 && memcmp(a,"\n--\n",4)==0 ) return 1; + while( n>0 && isspace(a[0]) ){ a++; n--; } + for(i=0; n>0 && i<8; n--, a++){ + if( isxdigit(a[0]) ) buf[i++] = a[0]; + } + if( i==8 && memcmp(buf,"53514c69",8)==0 ) return 1; + return 0; +} + +/* Implementation of the isdbsql(TEXT) SQL function. +*/ +static void isDbSqlFunc( + sqlite3_context *context, + int argc, + sqlite3_value **argv +){ + int n = sqlite3_value_bytes(argv[0]); + unsigned char *a = (unsigned char*)sqlite3_value_blob(argv[0]); + sqlite3_result_int(context, a!=0 && n>0 && isDbSql(a,n)); +} + /* Methods for the VHandle object */ static int inmemClose(sqlite3_file *pFile){ @@ -447,7 +910,7 @@ static int inmemRead( if( iOfst+iAmt>pVFile->sz ){ memset(pData, 0, iAmt); iAmt = (int)(pVFile->sz - iOfst); - memcpy(pData, pVFile->a, iAmt); + memcpy(pData, pVFile->a + iOfst, iAmt); return SQLITE_IOERR_SHORT_READ; } memcpy(pData, pVFile->a + iOfst, iAmt); @@ -717,23 +1180,28 @@ static void runSql(sqlite3 *db, const char *zSql, unsigned runFlags){ ** (2) Put all entries in order ** (3) Vacuum */ -static void rebuild_database(sqlite3 *db){ +static void rebuild_database(sqlite3 *db, int dbSqlOnly){ int rc; - rc = sqlite3_exec(db, + char *zSql; + zSql = sqlite3_mprintf( "BEGIN;\n" "CREATE TEMP TABLE dbx AS SELECT DISTINCT dbcontent FROM db;\n" "DELETE FROM db;\n" "INSERT INTO db(dbid, dbcontent) " " SELECT NULL, dbcontent FROM dbx ORDER BY 2;\n" "DROP TABLE dbx;\n" - "CREATE TEMP TABLE sx AS SELECT DISTINCT sqltext FROM xsql;\n" + "CREATE TEMP TABLE sx AS SELECT DISTINCT sqltext FROM xsql %s;\n" "DELETE FROM xsql;\n" "INSERT INTO xsql(sqlid,sqltext) " " SELECT NULL, sqltext FROM sx ORDER BY 2;\n" "DROP TABLE sx;\n" "COMMIT;\n" "PRAGMA page_size=1024;\n" - "VACUUM;\n", 0, 0, 0); + "VACUUM;\n", + dbSqlOnly ? " WHERE isdbsql(sqltext)" : "" + ); + rc = sqlite3_exec(db, zSql, 0, 0, 0); + sqlite3_free(zSql); if( rc ) fatalError("cannot rebuild: %s", sqlite3_errmsg(db)); } @@ -795,6 +1263,19 @@ static int integerValue(const char *zArg){ return (int)(isNeg? -v : v); } +/* +** Return the number of "v" characters in a string. Return 0 if there +** are any characters in the string other than "v". +*/ +static int numberOfVChar(const char *z){ + int N = 0; + while( z[0] && z[0]=='v' ){ + z++; + N++; + } + return z[0]==0 ? N : 0; +} + /* ** Print sketchy documentation for this utility program */ @@ -814,6 +1295,7 @@ static void showHelp(void){ " --limit-vdbe Panic if any test runs for more than 100,000 cycles\n" " --load-sql ARGS... Load SQL scripts fron files into SOURCE-DB\n" " --load-db ARGS... Load template databases from files into SOURCE_DB\n" +" --load-dbsql ARGS.. Load dbsqlfuzz outputs into the xsql table\n" " -m TEXT Add a description to the database\n" " --native-vfs Use the native VFS for initially empty database files\n" " --native-malloc Turn off MEMSYS3/5 and Lookaside\n" @@ -840,6 +1322,7 @@ int main(int argc, char **argv){ Blob *pSql; /* For looping over SQL scripts */ Blob *pDb; /* For looping over template databases */ int i; /* Loop index for the argv[] loop */ + int dbSqlOnly = 0; /* Only use scripts that are dbsqlfuzz */ int onlySqlid = -1; /* --sqlid */ int onlyDbid = -1; /* --dbid */ int nativeFlag = 0; /* --native-vfs */ @@ -868,6 +1351,7 @@ int main(int argc, char **argv){ int nativeMalloc = 0; /* Turn off MEMSYS3/5 and lookaside if true */ sqlite3_vfs *pDfltVfs; /* The default VFS */ int openFlags4Data; /* Flags for sqlite3_open_v2() */ + int nV; /* How much to increase verbosity with -vvvv */ sqlite3_initialize(); iBegin = timeOfDay(); @@ -895,7 +1379,7 @@ int main(int argc, char **argv){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); zExpDb = argv[++i]; }else - if( strcmp(z,"export-sql")==0 ){ + if( strcmp(z,"export-sql")==0 || strcmp(z,"export-dbsql")==0 ){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); zExpSql = argv[++i]; }else @@ -930,6 +1414,13 @@ int main(int argc, char **argv){ openFlags4Data = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; break; }else + if( strcmp(z,"load-dbsql")==0 ){ + zInsSql = "INSERT INTO xsql(sqltext)VALUES(CAST(readfile(?1) AS text))"; + iFirstInsArg = i+1; + openFlags4Data = SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE; + dbSqlOnly = 1; + break; + }else if( strcmp(z,"m")==0 ){ if( i>=argc-1 ) fatalError("missing arguments on %s", argv[i]); zMsg = argv[++i]; @@ -951,6 +1442,7 @@ int main(int argc, char **argv){ if( strcmp(z,"quiet")==0 || strcmp(z,"q")==0 ){ quietFlag = 1; verboseFlag = 0; + eVerbosity = 0; }else if( strcmp(z,"rebuild")==0 ){ rebuildFlag = 1; @@ -973,11 +1465,27 @@ int main(int argc, char **argv){ fatalError("timeout is not available on non-unix systems"); #endif }else - if( strcmp(z,"verbose")==0 || strcmp(z,"v")==0 ){ + if( strcmp(z,"verbose")==0 ){ quietFlag = 0; verboseFlag++; + eVerbosity++; if( verboseFlag>1 ) runFlags |= SQL_TRACE; }else + if( (nV = numberOfVChar(z))>=1 ){ + quietFlag = 0; + verboseFlag += nV; + eVerbosity += nV; + if( verboseFlag>1 ) runFlags |= SQL_TRACE; + }else + if( strcmp(z,"version")==0 ){ + int ii; + const char *zz; + printf("SQLite %s %s\n", sqlite3_libversion(), sqlite3_sourceid()); + for(ii=0; (zz = sqlite3_compileoption_get(ii))!=0; ii++){ + printf("%s\n", zz); + } + return 0; + }else { fatalError("unknown option: %s", argv[i]); } @@ -1094,6 +1602,8 @@ int main(int argc, char **argv){ if( zInsSql ){ sqlite3_create_function(db, "readfile", 1, SQLITE_UTF8, 0, readfileFunc, 0, 0); + sqlite3_create_function(db, "isdbsql", 1, SQLITE_UTF8, 0, + isDbSqlFunc, 0, 0); rc = sqlite3_prepare_v2(db, zInsSql, -1, &pStmt, 0); if( rc ) fatalError("cannot prepare statement [%s]: %s", zInsSql, sqlite3_errmsg(db)); @@ -1109,7 +1619,7 @@ int main(int argc, char **argv){ rc = sqlite3_exec(db, "COMMIT", 0, 0, 0); if( rc ) fatalError("cannot commit the transaction: %s", sqlite3_errmsg(db)); - rebuild_database(db); + rebuild_database(db, dbSqlOnly); sqlite3_close(db); return 0; } @@ -1196,7 +1706,7 @@ int main(int argc, char **argv){ printf("%s: rebuilding... ", zDbName); fflush(stdout); } - rebuild_database(db); + rebuild_database(db, 0); if( !quietFlag ) printf("done\n"); } @@ -1230,6 +1740,26 @@ int main(int argc, char **argv){ */ if( !verboseFlag && !quietFlag ) printf("%s:", zDbName); for(pSql=g.pFirstSql; pSql; pSql=pSql->pNext){ + if( isDbSql(pSql->a, pSql->sz) ){ + sqlite3_snprintf(sizeof(g.zTestName), g.zTestName, "sqlid=%d",pSql->id); + if( verboseFlag ){ + printf("%s\n", g.zTestName); + fflush(stdout); + }else if( !quietFlag ){ + static int prevAmt = -1; + int idx = pSql->seq; + int amt = idx*10/(g.nSql); + if( amt!=prevAmt ){ + printf(" %d%%", amt*10); + fflush(stdout); + prevAmt = amt; + } + } + runCombinedDbSqlInput(pSql->a, pSql->sz); + nTest++; + g.zTestName[0] = 0; + continue; + } for(pDb=g.pFirstDb; pDb; pDb=pDb->pNext){ int openFlags; const char *zVfs = "inmem"; diff --git a/test/fuzzdata7.db b/test/fuzzdata7.db index 69469f9fcd82b97ffa85c1573763db763fb623ff..f994daa2d09cce93dd59d63244501f6dad9c66bf 100644 GIT binary patch delta 445204 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 + +The dbtotxt utility program reads an SQLite database file and writes its +raw binary content to screen as a hex dump for testing and debugging +purposes. + +The hex-dump output is formatted in such a way as to be easily readable +both by humans and by software. The dbtotxt utility has long been a part +of the TH3 test suite. The output of dbtotxt can be embedded in TH3 test +scripts and used to generate very specific database files, perhaps with +deliberately introduced corruption. The cov1/corrupt*.test modules in +TH3 make extensive use of dbtotxt. + +More recently (2018-12-13) the dbtotxt utility has been added to the SQLite +core and the command-line shell (CLI) has been augmented to be able to read +dbtotxt output. The CLI dot-command is: + +> .open --hexdb ?OPTIONAL-FILENAME? + +If the OPTIONAL-FILENAME is included, then content is read from that file. +If OPTIONAL-FILENAME is omitted, then the text is taken from the input stream, +terminated by the "| end" line of the dbtotxt text. This allows small test +databases to be embedded directly in scripts. Consider this example: + +> + .open --hexdb + | size 8192 pagesize 4096 filename x9.db + | page 1 offset 0 + | 0: 53 51 4c 69 74 65 20 66 6f 72 6d 61 74 20 33 00 SQLite format 3. + | 16: 10 00 01 01 00 40 20 20 00 00 00 04 00 00 00 02 .....@ ........ + | 32: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 04 ................ + | 48: 00 00 00 00 00 00 00 00 00 00 00 01 00 00 00 00 ................ + | 80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 04 ................ + | 96: 00 2e 30 38 0d 00 00 00 01 0f c0 00 0f c0 00 00 ..08............ + | 4032: 3e 01 06 17 11 11 01 69 74 61 62 6c 65 74 31 74 >......itablet1t + | 4048: 31 02 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 1.CREATE TABLE t + | 4064: 31 28 78 2c 79 20 44 45 46 41 55 4c 54 20 78 27 1(x,y DEFAULT x' + | 4080: 66 66 27 2c 7a 20 44 45 46 41 55 4c 54 20 30 29 ff',z DEFAULT 0) + | page 2 offset 4096 + | 0: 0d 08 14 00 04 00 10 00 0e 05 0a 0f 04 15 00 10 ................ + | 16: 88 02 03 05 90 04 0e 08 00 00 00 00 00 00 00 00 ................ + | 1040: 00 00 00 00 ff 87 7c 02 05 8f 78 0e 08 00 00 00 ......|...x..... + | 2064: 00 00 00 ff 0c 0a 01 fb 00 00 00 00 00 00 00 00 ................ + | 2560: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 83 ................ + | 2576: 78 01 05 87 70 0e 08 00 00 00 00 00 00 00 00 00 x...p........... + | 3072: 00 00 00 00 00 00 00 00 00 ff 00 00 01 fb 00 00 ................ + | 3584: 00 00 00 00 00 83 78 00 05 87 70 0e 08 00 00 00 ......x...p..... + | 4080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ff ................ + | end x9.db + SELECT rowid FROM t1; + PRAGMA integrity_check; + +You can run this script to see that the database file is correctly decoded +and loaded. Furthermore, you can make subtle corruptions to the input +database simply by editing the hexadecimal description, then rerun the +script to verify that SQLite correctly handles the corruption. diff --git a/tool/index_usage.c b/tool/index_usage.c new file mode 100644 index 0000000..451fa65 --- /dev/null +++ b/tool/index_usage.c @@ -0,0 +1,233 @@ +/* +** 2018-12-04 +** +** The author disclaims copyright to this source code. In place of +** a legal notice, here is a blessing: +** +** May you do good and not evil. +** May you find forgiveness for yourself and forgive others. +** May you share freely, never taking more than you give. +** +************************************************************************* +** +** This file implements a utility program used to help determine which +** indexes in a database schema are used and unused, and how often specific +** indexes are used. +*/ +#include "sqlite3.h" +#include +#include +#include +#include + +static void usage(const char *argv0){ + printf("Usage: %s [OPTIONS] DATABASE LOG\n\n", argv0); + printf( + "DATABASE is an SQLite database against which various statements\n" + "have been run. The SQL text is stored in LOG. LOG is an SQLite\n" + "database with this schema:\n" + "\n" + " CREATE TABLE sqllog(sql TEXT);\n" + "\n" + "This utility program analyzes statements contained in LOG and prints\n" + "a report showing how many times each index in DATABASE is used by the\n" + "statements in LOG.\n" + "\n" + "DATABASE only needs to contain the schema used by the statements in\n" + "LOG. The content can be removed from DATABASE.\n" + ); + printf( + "\nOPTIONS:\n\n" + " --progress N Show a progress message after every N input rows\n" + " -q Omit error message when parsing log entries\n" + " --using NAME Print SQL statements that use index NAME\n" + ); + printf("\nAnalysis will be done by SQLite version %s dated %.20s\n" + "checkin number %.40s. Different versions\n" + "of SQLite might use different indexes.\n", + sqlite3_libversion(), sqlite3_sourceid(), sqlite3_sourceid()+21); + exit(1); +} + +int main(int argc, char **argv){ + sqlite3 *db = 0; /* The main database */ + sqlite3_stmt *pStmt = 0; /* a query */ + char *zSql; + int nErr = 0; + int rc; + int bQuiet = 0; + int i, j; + const char *zUsing = 0; + sqlite3_stmt *pIncrCnt = 0; + int nRow = 0; + int iProgress = 0; + + for(i=j=1; i0 && (nRow%iProgress)==0 ){ + printf("%d...\n", nRow); + fflush(stdout); + } + while( sqlite3_step(pS2)==SQLITE_ROW ){ + const char *zExplain = (const char*)sqlite3_column_text(pS2,3); + const char *z1, *z2; + int n; + /* printf("EXPLAIN: %s\n", zExplain); */ + z1 = strstr(zExplain, " USING INDEX "); + if( z1==0 ) continue; + z1 += 13; + for(z2=z1+1; z2[0] && z2[1]!='('; z2++){} + n = z2 - z1; + if( zUsing && sqlite3_strnicmp(zUsing, z1, n)==0 ){ + printf("Using %s:\n%s\n", zUsing, zLog); + fflush(stdout); + } + sqlite3_bind_text(pIncrCnt,1,z1,n,SQLITE_STATIC); + sqlite3_step(pIncrCnt); + sqlite3_reset(pIncrCnt); + } + } + sqlite3_finalize(pS2); + } + sqlite3_finalize(pStmt); + + /* Generate the report */ + rc = sqlite3_prepare_v2(db, + "SELECT tbl, idx, cnt, " + " (SELECT group_concat(name,',') FROM pragma_index_info(idx))" + " FROM temp.idxu, main.sqlite_master" + " WHERE temp.idxu.tbl=main.sqlite_master.tbl_name" + " AND temp.idxu.idx=main.sqlite_master.name" + " ORDER BY cnt DESC, tbl, idx", + -1, &pStmt, 0); + if( rc ){ + printf("Cannot query the result table - %s\n", + sqlite3_errmsg(db)); + goto errorOut; + } + while( sqlite3_step(pStmt)==SQLITE_ROW ){ + printf("%10d %s on %s(%s)\n", + sqlite3_column_int(pStmt, 2), + sqlite3_column_text(pStmt, 1), + sqlite3_column_text(pStmt, 0), + sqlite3_column_text(pStmt, 3)); + } + sqlite3_finalize(pStmt); + pStmt = 0; + +errorOut: + sqlite3_finalize(pIncrCnt); + sqlite3_finalize(pStmt); + sqlite3_close(db); + return nErr; +} diff --git a/tool/lemon.c b/tool/lemon.c index 1fca8b9..7ef99fd 100644 --- a/tool/lemon.c +++ b/tool/lemon.c @@ -4590,13 +4590,20 @@ void ReportTable( tplt_print(out,lemp,lemp->overflow,&lineno); tplt_xfer(lemp->name,in,out,&lineno); - /* Generate the table of rule information + /* Generate the tables of rule information. yyRuleInfoLhs[] and + ** yyRuleInfoNRhs[]. ** ** Note: This code depends on the fact that rules are number ** sequentually beginning with 0. */ for(i=0, rp=lemp->rule; rp; rp=rp->next, i++){ - fprintf(out," { %4d, %4d }, /* (%d) ",rp->lhs->index,-rp->nrhs,i); + fprintf(out," %4d, /* (%d) ", rp->lhs->index, i); + rule_print(out, rp); + fprintf(out," */\n"); lineno++; + } + tplt_xfer(lemp->name,in,out,&lineno); + for(i=0, rp=lemp->rule; rp; rp=rp->next, i++){ + fprintf(out," %3d, /* (%d) ", -rp->nrhs, i); rule_print(out, rp); fprintf(out," */\n"); lineno++; } @@ -4667,6 +4674,7 @@ void ReportTable( /* Append any addition code the user desires */ tplt_print(out,lemp,lemp->extracode,&lineno); + acttab_free(pActtab); fclose(in); fclose(out); return; diff --git a/tool/lempar.c b/tool/lempar.c index 325b0e5..94c0a31 100644 --- a/tool/lempar.c +++ b/tool/lempar.c @@ -686,13 +686,15 @@ static void yy_shift( yyTraceShift(yypParser, yyNewState, "Shift"); } -/* The following table contains information about every rule that -** is used during the reduce. -*/ -static const struct { - YYCODETYPE lhs; /* Symbol on the left-hand side of the rule */ - signed char nrhs; /* Negative of the number of RHS symbols in the rule */ -} yyRuleInfo[] = { +/* For rule J, yyRuleInfoLhs[J] contains the symbol on the left-hand side +** of that rule */ +static const YYCODETYPE yyRuleInfoLhs[] = { +%% +}; + +/* For rule J, yyRuleInfoNRhs[J] contains the negative of the number +** of symbols on the right-hand side of that rule. */ +static const signed char yyRuleInfoNRhs[] = { %% }; @@ -725,7 +727,7 @@ static YYACTIONTYPE yy_reduce( yymsp = yypParser->yytos; #ifndef NDEBUG if( yyTraceFILE && yyruleno<(int)(sizeof(yyRuleName)/sizeof(yyRuleName[0])) ){ - yysize = yyRuleInfo[yyruleno].nrhs; + yysize = yyRuleInfoNRhs[yyruleno]; if( yysize ){ fprintf(yyTraceFILE, "%sReduce %d [%s], go to state %d.\n", yyTracePrompt, @@ -740,7 +742,7 @@ static YYACTIONTYPE yy_reduce( /* Check that the stack is large enough to grow by a single entry ** if the RHS of the rule is empty. This ensures that there is room ** enough on the stack to push the LHS value */ - if( yyRuleInfo[yyruleno].nrhs==0 ){ + if( yyRuleInfoNRhs[yyruleno]==0 ){ #ifdef YYTRACKMAXSTACKDEPTH if( (int)(yypParser->yytos - yypParser->yystack)>yypParser->yyhwm ){ yypParser->yyhwm++; @@ -782,9 +784,9 @@ static YYACTIONTYPE yy_reduce( %% /********** End reduce actions ************************************************/ }; - assert( yyruleno Date: Wed, 13 Feb 2019 13:11:10 -0500 Subject: [PATCH 18/25] add test for VACUUM INTO --- test/sqlcipher-compatibility.test | 23 ++++++++++++++++++----- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/test/sqlcipher-compatibility.test b/test/sqlcipher-compatibility.test index 80e3974..a20b83a 100644 --- a/test/sqlcipher-compatibility.test +++ b/test/sqlcipher-compatibility.test @@ -553,7 +553,8 @@ file delete -force test2.db # then delete it and run a manual vacuum # verify that the file has become smaller # but can still be opened with the proper -# key +# key. also test vacuum into functionality introduced +# in sqlite 3.27.1 do_test vacuum { sqlite_orig db test.db set rc {} @@ -579,17 +580,28 @@ do_test vacuum { execsql { DELETE FROM t1 WHERE rowid > 5000; + VACUUM into 'test-vacuum.db'; VACUUM; } db close - # grab new file size, post - # autovacuum - set sz2 [file size test.db] + # grab separate vacuum file size + set sz2 [file size test-vacuum.db] + + # grab test.db file size, post vacuum + set sz3 [file size test.db] # verify that the new size is # smaller than the old size if {$sz > $sz2} { lappend rc true } + if {$sz > $sz3} { lappend rc true } + + sqlite_orig db test-vacuum.db + lappend rc [execsql { + PRAGMA key = 'testkey'; + SELECT count(*) FROM t1; + }] + db close sqlite_orig db test.db lappend rc [execsql { @@ -597,9 +609,10 @@ do_test vacuum { SELECT count(*) FROM t1; }] -} {10000 true 5000} +} {10000 true true 5000 5000} db close file delete -force test.db +file delete -force test-vacuum.db # open a 1.1.8 database (no HMAC, 4K iter), then # try to open another 1.1.8 database. The From cced1c4d8bfe722b7e49a248f36db0697cf0c890 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Thu, 21 Feb 2019 09:12:12 -0500 Subject: [PATCH 19/25] bump version to 4.1.0 --- CHANGELOG.md | 5 ++++- SQLCipher.podspec.json | 4 ++-- src/crypto.h | 2 +- test/sqlcipher-pragmas.test | 2 +- 4 files changed, 8 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index aad1b63..ed097cf 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # SQLCipher Change Log All notable changes to this project will be documented in this file. -## [unreleased] - [unreleased] +## [4.1.0] - [unreleased] - Defer reading salt from header until key derivation is triggered - Clarify usage of sqlite3_rekey for plaintext databases in header - Normalize attach behavior when key is not yet derived @@ -10,6 +10,9 @@ All notable changes to this project will be documented in this file. - PRAGMA cipher_hmac_pgno is now deprecated - PRAGMA cipher_hmac_salt_mask is now deprecated - PRAGMA fast_kdf_iter is now deprecated +- Clear codec data buffers if a crypographic provider operation fails +- Disable backup API for encrypted databases (this was previously documented as not-working and non-supported, but will now explicitly error out on initialization) +- Updates baseline to upstream SQLite 3.27.1 ## [4.0.1] - 2018-12-17 - Based on upstream SQLite 3.26.0 (addresses SQLite “Magellan” issue) diff --git a/SQLCipher.podspec.json b/SQLCipher.podspec.json index 9fe2b00..6b9905d 100644 --- a/SQLCipher.podspec.json +++ b/SQLCipher.podspec.json @@ -15,10 +15,10 @@ "requires_arc": false, "source": { "git": "https://github.com/sqlcipher/sqlcipher.git", - "tag": "v4.0.1" + "tag": "v4.1.0" }, "summary": "Full Database Encryption for SQLite.", - "version": "4.0.1", + "version": "4.1.0", "subspecs": [ { "compiler_flags": [ diff --git a/src/crypto.h b/src/crypto.h index 440c718..b32922d 100644 --- a/src/crypto.h +++ b/src/crypto.h @@ -58,7 +58,7 @@ void sqlite3pager_reset(Pager *pPager); #define CIPHER_STR(s) #s #ifndef CIPHER_VERSION_NUMBER -#define CIPHER_VERSION_NUMBER 4.0.1 +#define CIPHER_VERSION_NUMBER 4.1.0 #endif #ifndef CIPHER_VERSION_BUILD diff --git a/test/sqlcipher-pragmas.test b/test/sqlcipher-pragmas.test index 843ed2a..93fcad9 100644 --- a/test/sqlcipher-pragmas.test +++ b/test/sqlcipher-pragmas.test @@ -46,7 +46,7 @@ do_test verify-pragma-cipher-version { execsql { PRAGMA cipher_version; } -} {{4.0.1 community}} +} {{4.1.0 community}} db close file delete -force test.db From 9e2eeb3f809143b0a79d42f0195b4d645e61142b Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Fri, 22 Feb 2019 16:32:19 -0500 Subject: [PATCH 20/25] fix cast for memset --- src/crypto.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/crypto.c b/src/crypto.c index e60b533..7519849 100644 --- a/src/crypto.c +++ b/src/crypto.c @@ -684,7 +684,7 @@ static void* sqlite3Codec(void *iCtx, void *data, Pgno pgno, int mode) { rc = sqlcipher_page_cipher(ctx, cctx, pgno, CIPHER_DECRYPT, page_sz - offset, pData + offset, (unsigned char*)buffer + offset); if(rc != SQLITE_OK) { /* clear results of failed cipher operation and set error */ - sqlcipher_memset(buffer+offset, 0, page_sz-offset); + sqlcipher_memset((unsigned char*) buffer+offset, 0, page_sz-offset); sqlcipher_codec_ctx_set_error(ctx, rc); } memcpy(pData, buffer, page_sz); /* copy buffer data back to pData and return */ @@ -706,7 +706,7 @@ static void* sqlite3Codec(void *iCtx, void *data, Pgno pgno, int mode) { } rc = sqlcipher_page_cipher(ctx, cctx, pgno, CIPHER_ENCRYPT, page_sz - offset, pData + offset, (unsigned char*)buffer + offset); if(rc != SQLITE_OK) { /* clear results of failed cipher operation and set error */ - sqlcipher_memset(buffer+offset, 0, page_sz-offset); + sqlcipher_memset((unsigned char*)buffer+offset, 0, page_sz-offset); sqlcipher_codec_ctx_set_error(ctx, rc); } return buffer; /* return persistent buffer data, pData remains intact */ From 49234e8eaf3baf4f4a70c5c07e988ce30ba99401 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Mon, 25 Feb 2019 14:46:38 -0500 Subject: [PATCH 21/25] Snapshot of upstream SQLite 3.27.2 --- VERSION | 2 +- configure | 18 ++++++------- manifest | 36 +++++++++++++------------- manifest.uuid | 2 +- src/expr.c | 40 ++++++----------------------- src/insert.c | 7 ++++-- src/resolve.c | 49 ++++++++++++++++++++++++++---------- src/sqlite.h.in | 2 +- src/sqliteInt.h | 2 +- src/vdbe.c | 24 +++++------------- src/wherecode.c | 4 ++- test/in.test | 64 +++++++++++++++++++++++++++++++++++++++++++++++ test/where.test | 12 +++++++++ test/window1.test | 20 +++++++++++++++ 14 files changed, 184 insertions(+), 98 deletions(-) diff --git a/VERSION b/VERSION index c521c77..8e6b2f2 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -3.27.1 +3.27.2 diff --git a/configure b/configure index bb8daa5..ce6389e 100755 --- a/configure +++ b/configure @@ -1,6 +1,6 @@ #! /bin/sh # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for sqlite 3.27.1. +# Generated by GNU Autoconf 2.69 for sqlite 3.27.2. # # # Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc. @@ -726,8 +726,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='sqlite' PACKAGE_TARNAME='sqlite' -PACKAGE_VERSION='3.27.1' -PACKAGE_STRING='sqlite 3.27.1' +PACKAGE_VERSION='3.27.2' +PACKAGE_STRING='sqlite 3.27.2' PACKAGE_BUGREPORT='' PACKAGE_URL='' @@ -1466,7 +1466,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures sqlite 3.27.1 to adapt to many kinds of systems. +\`configure' configures sqlite 3.27.2 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1531,7 +1531,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of sqlite 3.27.1:";; + short | recursive ) echo "Configuration of sqlite 3.27.2:";; esac cat <<\_ACEOF @@ -1657,7 +1657,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -sqlite configure 3.27.1 +sqlite configure 3.27.2 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2076,7 +2076,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by sqlite $as_me 3.27.1, which was +It was created by sqlite $as_me 3.27.2, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -12232,7 +12232,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by sqlite $as_me 3.27.1, which was +This file was extended by sqlite $as_me 3.27.2, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -12298,7 +12298,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -sqlite config.status 3.27.1 +sqlite config.status 3.27.2 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/manifest b/manifest index 65f29c9..54a6ebd 100644 --- a/manifest +++ b/manifest @@ -1,12 +1,12 @@ -C Version\s3.27.1 -D 2019-02-08T13:17:39.690 +C Version\s3.27.2 +D 2019-02-25T16:06:06.705 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F Makefile.in 178d8eb6840771149cee40b322d1b3be30d330198c522c903c1b66fb5a1bfca4 F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 5df60c70edb157feb2148a14c687551969599bd065875a0b959b6b139721ca72 F README.md 377233394b905d3b2e2b33741289e093bc93f2e7adbe00923b2c5958c9a9edee -F VERSION 15b2d421b2265aad451c0493066c1c31a511a72c5153bb4e9d5f62adbc12134c +F VERSION a45c4d2eb2f9c1432c4e49d9306ccb0cd3f88dccddfa52ea1fe7460ce005e58a F aclocal.m4 a5c22d164aff7ed549d53a90fa56d56955281f50 F art/sqlite370.eps aa97a671332b432a54e1d74ff5e8775be34200c2 F art/sqlite370.ico af56c1d00fee7cd4753e8631ed60703ed0fc6e90 @@ -33,7 +33,7 @@ F autoconf/tea/win/rules.vc c511f222b80064096b705dbeb97060ee1d6b6d63 F config.guess 226d9a188c6196f3033ffc651cbc9dcee1a42977 F config.h.in 6376abec766e9a0785178b1823b5a587e9f1ccbc F config.sub 9ebe4c3b3dab6431ece34f16828b594fb420da55 -F configure 2b0310f5ddb82f4e2c524c0bc7bacf480b0ac21bf05b543d7e72e2682772eaac x +F configure 7fd4706775d3c31e928d3e94bcfca5150a60d5abfc6a36a20fa43ad66dc4d467 x F configure.ac 3552d3aecade98a9d4b64bceb48ffb7726cbc85902efde956812942f060fbd0a F contrib/sqlitecon.tcl 210a913ad63f9f991070821e599d600bd913e0ad F doc/F2FS.txt c1d4a0ae9711cfe0e1d8b019d154f1c29e0d3abfe820787ba1e9ed7691160fcd @@ -466,7 +466,7 @@ F src/date.c ebe1dc7c8a347117bb02570f1a931c62dd78f4a2b1b516f4837d45b7d6426957 F src/dbpage.c 135eb3b5e74f9ef74bde5cec2571192c90c86984fa534c88bf4a055076fa19b7 F src/dbstat.c c12833de69cb655751487d2c5a59607e36be1c58ba1f4bd536609909ad47b319 F src/delete.c d08c9e01a2664afd12edcfa3a9c6578517e8ff8735f35509582693adbe0edeaf -F src/expr.c 182dc9ff30aa6a430b7f728ce84fda85ec10890e29fdf75be1e871d13222a99c +F src/expr.c f2d0ecf68213770be4fad83128ce02e67667deebaa0a44061313f7e4f2a4ae28 F src/fault.c 460f3e55994363812d9d60844b2a6de88826e007 F src/fkey.c bd0138acdc008c1845ccf92f8e73787880562de649471804801c06fed814c765 F src/func.c 0341881d22903aac5ba7f352b188806d6436e1d6ae4235ff01e44d56879dfe63 @@ -475,7 +475,7 @@ F src/hash.c a12580e143f10301ed5166ea4964ae2853d3905a511d4e0c44497245c7ce1f7a F src/hash.h ab34c5c54a9e9de2e790b24349ba5aab3dbb4fd4 F src/hwtime.h 747c1bbe9df21a92e9c50f3bbec1de841dc5e5da F src/in-operator.md 10cd8f4bcd225a32518407c2fb2484089112fd71 -F src/insert.c 3ed9ceaa4b7d56a6f2613355e1cd1ae5cfe31712bce2bf5aa93c5f1f130704b2 +F src/insert.c 7b71ba94e3283b497c076068fdeea760ce93b9db7d6784bdf5404fc842b721e5 F src/legacy.c d7874bc885906868cd51e6c2156698f2754f02d9eee1bae2d687323c3ca8e5aa F src/loadext.c e6f10875d52aca3b7e57ce1ec174aeafc9b6c00b43000cd30d791f9cb490b7a6 F src/main.c 27d7265625ea6eaccdfe7c53ef41adc179c9357a077702a860c1a3b0a037a16f @@ -512,14 +512,14 @@ F src/pragma.h a776bb9c915207e9d1117b5754743ddf1bf6a39cc092a4a44e74e6cb5fab1177 F src/prepare.c 78027c6231fbb19ca186a5f5f0c0a1375d9c2cec0655273f9bd90d9ff74a34b3 F src/printf.c cbf27c320091a83279d1738f68a27a9fe01698c607ce80516ab6bdb5a9c36a1a F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 -F src/resolve.c c8f207247472c41ac73d738e1c1a80719ad253d1dbb617ed57740492b2a6c097 +F src/resolve.c dd7550ed05486c49c2b467b46ef37c78cdf6bf9df3b15134816d081691fd42d1 F src/rowset.c d977b011993aaea002cab3e0bb2ce50cf346000dff94e944d547b989f4b1fe93 F src/select.c c998f694759e37799929e28df8a2649747f8774d4fc233529ab6bda689388e15 F src/shell.c.in f2c1adbee3f6f36686b4a38d2168ebfc25298b4ad1e6d95199fc4e95b539251d -F src/sqlite.h.in 7da74fd5bd7a9dbe92297060f036935520b26e240457287c5e67c7b9db51a986 +F src/sqlite.h.in 8859e0b45b48d4186fbc466885e508f8272420a349099acdebcdb8d410d54824 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 F src/sqlite3ext.h 960f1b86c3610fa23cb6a267572a97dcf286e77aa0dd3b9b23292ffaa1ea8683 -F src/sqliteInt.h f657e35d824fdc17ddf46bb85f0193df3b965e8354ded9ec37825057e3224bcc +F src/sqliteInt.h ea0b5769140ca4bed03aeca8e7abb5c7a3eef4ffac723c8db3cfde88c390f807 F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b F src/status.c 46e7aec11f79dad50965a5ca5fa9de009f7d6bde08be2156f1538a0a296d4d0e F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34 @@ -585,7 +585,7 @@ F src/upsert.c 0dd81b40206841814d46942a7337786932475f085716042d0cb2fc7791bf8ca4 F src/utf.c 810fbfebe12359f10bc2a011520a6e10879ab2a163bcb26c74768eab82ea62a5 F src/util.c 82a2e3f691a3b654be872e305dab1f455e565dedf5e6a90c818c1ab307c00432 F src/vacuum.c a9f389f41556c0ec310bc9169dc9476603c30a0a913ad92bfbc75c86886967ca -F src/vdbe.c b7b6f965153607072917dbd81d654a268abf4872c58d556701d1549550766c02 +F src/vdbe.c 2c61090f2328ad125c8e55b4dab0712a78cfdfac893152fae34bed7e015b7cd7 F src/vdbe.h 712bca562eaed1c25506b9faf9680bdc75fc42e2f4a1cd518d883fa79c7a4237 F src/vdbeInt.h a76d5eed62c76bcd8de7afd3147fac1bc40c5a870582664bcd7d071ef437c37f F src/vdbeapi.c 57a2d794a8833f269b878dbc24e955369bdb379af6c4e93ebc5ce1a20fa3daf4 @@ -601,7 +601,7 @@ F src/wal.h 606292549f5a7be50b6227bd685fa76e3a4affad71bb8ac5ce4cb5c79f6a176a F src/walker.c 7607f1a68130c028255d8d56094ea602fc402c79e1e35a46e6282849d90d5fe4 F src/where.c 8a207cb2ca6b99e1edb1e4bbff9b0504385a759cbf66180d1deb34d80ca4b799 F src/whereInt.h 5f14db426ca46a83eabab1ae9aa6d4b8f27504ad35b64c290916289b1ddb2e88 -F src/wherecode.c a571d8d7c19d6db786a201f2df8788b320fefcb2842f2a1eb9a85b85e91bc35f +F src/wherecode.c 061848646cc46a137d9038e47e666a955b3b2a1b458365eeed76b004c0053f3b F src/whereexpr.c 36b47f7261d6b6f1a72d774c113b74beddf6745aba1018e64b196e29db233442 F src/window.c df2456386e0b1553a8d1fcf3a0ddc4c058fe2c650ea8c74b6bf8862082ddafc9 F test/8_3_names.test ebbb5cd36741350040fd28b432ceadf495be25b2 @@ -1006,7 +1006,7 @@ F test/hook2.test b9ff3b8c6519fb67f33192f1afe86e7782ee4ac8 F test/icu.test 41aa8847745a879b897a7febea0f8f9efc8e67fe8bf680589b6e07c7b0a1569a F test/ieee754.test 806fc0ce7f305f57e3331eaceeddcfec9339e607 F test/imposter1.test c3f1db2d3db2c24611a6596a3fc0ffc14f1466c8 -F test/in.test 2fa2dfba1afe30eb830f327e7131dfadaa7a701d677de0eb65f9303d99e18fe0 +F test/in.test 63933d7b71eed01a49df55541a73a75398302b50a05b5333f90481460a32ff49 F test/in2.test 5d4c61d17493c832f7d2d32bef785119e87bde75 F test/in3.test 3cbf58c87f4052cee3a58b37b6389777505aa0c0 F test/in4.test d2b38cba404bc4320f4fe1b595b3d163f212c068 @@ -1645,7 +1645,7 @@ F test/walshared.test 0befc811dcf0b287efae21612304d15576e35417 F test/walslow.test c05c68d4dc2700a982f89133ce103a1a84cc285f F test/walthread.test 14b20fcfa6ae152f5d8e12f5dc8a8a724b7ef189f5d8ef1e2ceab79f2af51747 F test/walvfs.test c0faffda13d045a96dfc541347886bb1a3d6f3205857fc98e683edfab766ea88 -F test/where.test 8215d220633f08da331781cf9ede7fb7aed50eb113473c10acd39a643fd258ba +F test/where.test 93738e224cd5e7819565a9f272c19fd0ee5893d9cd7f5238ce026bae09b8d710 F test/where2.test 478d2170637b9211f593120648858593bf2445a1 F test/where3.test 2341a294e17193a6b1699ea7f192124a5286ca6acfcc3f4b06d16c931fbcda2c F test/where4.test 4a371bfcc607f41d233701bdec33ac2972908ba8 @@ -1675,7 +1675,7 @@ F test/win32heap.test 10fd891266bd00af68671e702317726375e5407561d859be1aa04696f2 F test/win32lock.test fbf107c91d8f5512be5a5b87c4c42ab9fdd54972 F test/win32longpath.test 169c75a3b2e43481f4a62122510210c67b08f26d F test/win32nolock.test ac4f08811a562e45a5755e661f45ca85892bdbbc -F test/window1.test 2798c8249e0f122c9bacce6aa7324765a5cd9106e49e7aacc81f6033d281577b +F test/window1.test d141eba02ee4d7441dcb45148d776aded21992e8de6ddbbe2aae8151e5fad45e F test/window2.tcl 9bfa842d8a62b0d36dc8c1b5972206393c43847433c6d75940b87fec93ce3143 F test/window2.test 8e6d2a1b9f54dfebee1cde961c8590cd87b4db45c50f44947a211e1b63c2a05e F test/window3.tcl 577a3b1ff913208e5248c04dab9df17fd760ce159a752789e26d0cb4a5f91823 @@ -1804,11 +1804,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P d5d944d7947d7b44ba9a1c844418af49c5f39dbe84f181af790bb1412daed578 -R 2251df76230cd55e64293ef8a825ebab +P a21ffcd8176672e791c11e7d3869878b0655e9f7fb3646378421fb7480d4d8c6 +R a79d07126ad692dd98c735ebc3ce8975 T +bgcolor * #d0c0ff T +sym-release * -T +sym-version-3.27.1 * +T +sym-version-3.27.2 * U drh -Z 4aa002629995b65b1d5f498ebad69e25 +Z 1721b9485efb0ba623f21704b685d9c7 # Remove this line to create a well-formed manifest. diff --git a/manifest.uuid b/manifest.uuid index 68364f7..c42113e 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -0eca3dd3d38b31c92b49ca2d311128b74584714d9e7de895b1a6286ef959a1dd +bd49a8271d650fa89e446b42e513b595a717b9212c91dd384aab871fc1d0f6d7 diff --git a/src/expr.c b/src/expr.c index 03ecf15..e39b640 100644 --- a/src/expr.c +++ b/src/expr.c @@ -2552,14 +2552,11 @@ int sqlite3FindInIndex( eType = IN_INDEX_EPH; if( inFlags & IN_INDEX_LOOP ){ pParse->nQueryLoop = 0; - if( pX->pLeft->iColumn<0 && !ExprHasProperty(pX, EP_xIsSelect) ){ - eType = IN_INDEX_ROWID; - } }else if( prRhsHasNull ){ *prRhsHasNull = rMayHaveNull = ++pParse->nMem; } assert( pX->op==TK_IN ); - sqlite3CodeRhsOfIN(pParse, pX, iTab, eType==IN_INDEX_ROWID); + sqlite3CodeRhsOfIN(pParse, pX, iTab); if( rMayHaveNull ){ sqlite3SetHasNullFlag(v, iTab, rMayHaveNull); } @@ -2660,12 +2657,6 @@ void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ ** however the cursor number returned might not be the same, as it might ** have been duplicated using OP_OpenDup. ** -** If parameter isRowid is non-zero, then LHS of the IN operator is guaranteed -** to be a non-null integer. In this case, the ephemeral table can be an -** table B-Tree that keyed by only integers. The more general cases uses -** an index B-Tree which can have arbitrary keys, but is slower to both -** read and write. -** ** If the LHS expression ("x" in the examples) is a column value, or ** the SELECT statement returns a column value, then the affinity of that ** column is used to build the index keys. If both 'x' and the @@ -2677,8 +2668,7 @@ void sqlite3VectorErrorMsg(Parse *pParse, Expr *pExpr){ void sqlite3CodeRhsOfIN( Parse *pParse, /* Parsing context */ Expr *pExpr, /* The IN operator */ - int iTab, /* Use this cursor number */ - int isRowid /* If true, LHS is a rowid */ + int iTab /* Use this cursor number */ ){ int addrOnce = 0; /* Address of the OP_Once instruction at top */ int addr; /* Address of OP_OpenEphemeral instruction */ @@ -2731,14 +2721,12 @@ void sqlite3CodeRhsOfIN( /* Check to see if this is a vector IN operator */ pLeft = pExpr->pLeft; nVal = sqlite3ExprVectorSize(pLeft); - assert( !isRowid || nVal==1 ); /* Construct the ephemeral table that will contain the content of ** RHS of the IN operator. */ pExpr->iTable = iTab; - addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, - pExpr->iTable, (isRowid?0:nVal)); + addr = sqlite3VdbeAddOp2(v, OP_OpenEphemeral, pExpr->iTable, nVal); #ifdef SQLITE_ENABLE_EXPLAIN_COMMENTS if( ExprHasProperty(pExpr, EP_xIsSelect) ){ VdbeComment((v, "Result of SELECT %u", pExpr->x.pSelect->selId)); @@ -2746,7 +2734,7 @@ void sqlite3CodeRhsOfIN( VdbeComment((v, "RHS of IN operator")); } #endif - pKeyInfo = isRowid ? 0 : sqlite3KeyInfoAlloc(pParse->db, nVal, 1); + pKeyInfo = sqlite3KeyInfoAlloc(pParse->db, nVal, 1); if( ExprHasProperty(pExpr, EP_xIsSelect) ){ /* Case 1: expr IN (SELECT ...) @@ -2760,7 +2748,6 @@ void sqlite3CodeRhsOfIN( ExplainQueryPlan((pParse, 1, "%sLIST SUBQUERY %d", addrOnce?"":"CORRELATED ", pSelect->selId )); - assert( !isRowid ); /* If the LHS and RHS of the IN operator do not match, that ** error will have been caught long before we reach this point. */ if( ALWAYS(pEList->nExpr==nVal) ){ @@ -2813,10 +2800,8 @@ void sqlite3CodeRhsOfIN( /* Loop through each expression in . */ r1 = sqlite3GetTempReg(pParse); r2 = sqlite3GetTempReg(pParse); - if( isRowid ) sqlite3VdbeAddOp4(v, OP_Blob, 0, r2, 0, "", P4_STATIC); for(i=pList->nExpr, pItem=pList->a; i>0; i--, pItem++){ Expr *pE2 = pItem->pExpr; - int iValToIns; /* If the expression is not constant then we will need to ** disable the test that was generated above that makes sure @@ -2829,20 +2814,9 @@ void sqlite3CodeRhsOfIN( } /* Evaluate the expression and insert it into the temp table */ - if( isRowid && sqlite3ExprIsInteger(pE2, &iValToIns) ){ - sqlite3VdbeAddOp3(v, OP_InsertInt, iTab, r2, iValToIns); - }else{ - r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); - if( isRowid ){ - sqlite3VdbeAddOp2(v, OP_MustBeInt, r3, - sqlite3VdbeCurrentAddr(v)+2); - VdbeCoverage(v); - sqlite3VdbeAddOp3(v, OP_Insert, iTab, r2, r3); - }else{ - sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); - sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r3, 1); - } - } + r3 = sqlite3ExprCodeTarget(pParse, pE2, r1); + sqlite3VdbeAddOp4(v, OP_MakeRecord, r3, 1, r2, &affinity, 1); + sqlite3VdbeAddOp4Int(v, OP_IdxInsert, iTab, r2, r3, 1); } sqlite3ReleaseTempReg(pParse, r1); sqlite3ReleaseTempReg(pParse, r2); diff --git a/src/insert.c b/src/insert.c index a69e625..8d069b0 100644 --- a/src/insert.c +++ b/src/insert.c @@ -1919,10 +1919,13 @@ void sqlite3CompleteInsertion( pik_flags |= (update_flags & OPFLAG_SAVEPOSITION); #ifdef SQLITE_ENABLE_PREUPDATE_HOOK if( update_flags==0 ){ - sqlite3VdbeAddOp4(v, OP_InsertInt, - iIdxCur+i, aRegIdx[i], 0, (char*)pTab, P4_TABLE + int r = sqlite3GetTempReg(pParse); + sqlite3VdbeAddOp2(v, OP_Integer, 0, r); + sqlite3VdbeAddOp4(v, OP_Insert, + iIdxCur+i, aRegIdx[i], r, (char*)pTab, P4_TABLE ); sqlite3VdbeChangeP5(v, OPFLAG_ISNOOP); + sqlite3ReleaseTempReg(pParse, r); } #endif } diff --git a/src/resolve.c b/src/resolve.c index 86fd543..fd9ab84 100644 --- a/src/resolve.c +++ b/src/resolve.c @@ -1243,6 +1243,38 @@ int sqlite3ResolveOrderGroupBy( return 0; } +#ifndef SQLITE_OMIT_WINDOWFUNC +/* +** Walker callback for resolveRemoveWindows(). +*/ +static int resolveRemoveWindowsCb(Walker *pWalker, Expr *pExpr){ + if( ExprHasProperty(pExpr, EP_WinFunc) ){ + Window **pp; + for(pp=&pWalker->u.pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ + if( *pp==pExpr->y.pWin ){ + *pp = (*pp)->pNextWin; + break; + } + } + } + return WRC_Continue; +} + +/* +** Remove any Window objects owned by the expression pExpr from the +** Select.pWin list of Select object pSelect. +*/ +static void resolveRemoveWindows(Select *pSelect, Expr *pExpr){ + Walker sWalker; + memset(&sWalker, 0, sizeof(Walker)); + sWalker.xExprCallback = resolveRemoveWindowsCb; + sWalker.u.pSelect = pSelect; + sqlite3WalkExpr(&sWalker, pExpr); +} +#else +# define resolveRemoveWindows(x,y) +#endif + /* ** pOrderBy is an ORDER BY or GROUP BY clause in SELECT statement pSelect. ** The Name context of the SELECT statement is pNC. zType is either @@ -1309,19 +1341,10 @@ static int resolveOrderGroupBy( } for(j=0; jpEList->nExpr; j++){ if( sqlite3ExprCompare(0, pE, pSelect->pEList->a[j].pExpr, -1)==0 ){ -#ifndef SQLITE_OMIT_WINDOWFUNC - if( ExprHasProperty(pE, EP_WinFunc) ){ - /* Since this window function is being changed into a reference - ** to the same window function the result set, remove the instance - ** of this window function from the Select.pWin list. */ - Window **pp; - for(pp=&pSelect->pWin; *pp; pp=&(*pp)->pNextWin){ - if( *pp==pE->y.pWin ){ - *pp = (*pp)->pNextWin; - } - } - } -#endif + /* Since this expresion is being changed into a reference + ** to an identical expression in the result set, remove all Window + ** objects belonging to the expression from the Select.pWin list. */ + resolveRemoveWindows(pSelect, pE); pItem->u.x.iOrderByCol = j+1; } } diff --git a/src/sqlite.h.in b/src/sqlite.h.in index 392532a..f291027 100644 --- a/src/sqlite.h.in +++ b/src/sqlite.h.in @@ -2369,7 +2369,7 @@ int sqlite3_changes(sqlite3*); ** not. ^Changes to a view that are intercepted by INSTEAD OF triggers ** are not counted. ** -** This the [sqlite3_total_changes(D)] interface only reports the number +** The [sqlite3_total_changes(D)] interface only reports the number ** of rows that changed due to SQL statement run against database ** connection D. Any changes by other database connections are ignored. ** To detect changes against a database file from other database diff --git a/src/sqliteInt.h b/src/sqliteInt.h index 774d3e5..4940511 100644 --- a/src/sqliteInt.h +++ b/src/sqliteInt.h @@ -4279,7 +4279,7 @@ void sqlite3AlterRenameColumn(Parse*, SrcList*, Token*, Token*); int sqlite3GetToken(const unsigned char *, int *); void sqlite3NestedParse(Parse*, const char*, ...); void sqlite3ExpirePreparedStatements(sqlite3*, int); -void sqlite3CodeRhsOfIN(Parse*, Expr*, int, int); +void sqlite3CodeRhsOfIN(Parse*, Expr*, int); int sqlite3CodeSubselect(Parse*, Expr*); void sqlite3SelectPrep(Parse*, Select*, NameContext*); void sqlite3SelectWrongNumTermsError(Parse *pParse, Select *p); diff --git a/src/vdbe.c b/src/vdbe.c index 98df0a3..9f37624 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -4580,14 +4580,7 @@ case OP_NewRowid: { /* out2 */ ** This instruction only works on tables. The equivalent instruction ** for indices is OP_IdxInsert. */ -/* Opcode: InsertInt P1 P2 P3 P4 P5 -** Synopsis: intkey=P3 data=r[P2] -** -** This works exactly like OP_Insert except that the key is the -** integer value P3, not the value of the integer stored in register P3. -*/ -case OP_Insert: -case OP_InsertInt: { +case OP_Insert: { Mem *pData; /* MEM cell holding data for the record to be inserted */ Mem *pKey; /* MEM cell holding key for the record */ VdbeCursor *pC; /* Cursor to table into which insert is written */ @@ -4608,16 +4601,11 @@ case OP_InsertInt: { REGISTER_TRACE(pOp->p2, pData); sqlite3VdbeIncrWriteCounter(p, pC); - if( pOp->opcode==OP_Insert ){ - pKey = &aMem[pOp->p3]; - assert( pKey->flags & MEM_Int ); - assert( memIsValid(pKey) ); - REGISTER_TRACE(pOp->p3, pKey); - x.nKey = pKey->u.i; - }else{ - assert( pOp->opcode==OP_InsertInt ); - x.nKey = pOp->p3; - } + pKey = &aMem[pOp->p3]; + assert( pKey->flags & MEM_Int ); + assert( memIsValid(pKey) ); + REGISTER_TRACE(pOp->p3, pKey); + x.nKey = pKey->u.i; if( pOp->p4type==P4_TABLE && HAS_UPDATE_HOOK(db) ){ assert( pC->iDb>=0 ); diff --git a/src/wherecode.c b/src/wherecode.c index 1931577..7918938 100644 --- a/src/wherecode.c +++ b/src/wherecode.c @@ -582,7 +582,6 @@ static int codeEqualityTerm( if( pLoop->aLTerm[i]->pExpr==pX ){ int iOut = iReg + i - iEq; if( eType==IN_INDEX_ROWID ){ - testcase( nEq>1 ); /* Happens with a UNIQUE index on ROWID */ pIn->addrInTop = sqlite3VdbeAddOp2(v, OP_Rowid, iTab, iOut); }else{ int iCol = aiMap ? aiMap[iMap++] : 0; @@ -1344,6 +1343,9 @@ Bitmask sqlite3WhereCodeOneLoopStart( sqlite3VdbeAddOp3(v, OP_SeekRowid, iCur, addrNxt, iRowidReg); VdbeCoverage(v); pLevel->op = OP_Noop; + if( (pTerm->prereqAll & pLevel->notReady)==0 ){ + pTerm->wtFlags |= TERM_CODED; + } }else if( (pLoop->wsFlags & WHERE_IPK)!=0 && (pLoop->wsFlags & WHERE_COLUMN_RANGE)!=0 ){ diff --git a/test/in.test b/test/in.test index 478c008..246cd76 100644 --- a/test/in.test +++ b/test/in.test @@ -651,4 +651,68 @@ do_execsql_test in-14.1 { SELECT * FROM c1 WHERE a IN (SELECT a FROM c1) ORDER BY 1 } {1 2 3 4} +# 2019-02-20 Ticket https://www.sqlite.org/src/tktview/df46dfb631f75694fbb97033b69 +# +do_execsql_test in-15.0 { + DROP TABLE IF EXISTS t1; + CREATE TABLE IF NOT EXISTS t1(id INTEGER PRIMARY KEY); + INSERT INTO t1 VALUES(1); + SELECT a.id FROM t1 AS a JOIN t1 AS b ON a.id=b.id WHERE a.id IN (1,2,3); +} {1} +do_execsql_test in-15.1 { + DROP TABLE IF EXISTS t2; + CREATE TABLE t2(a INTEGER PRIMARY KEY,b); + INSERT INTO t2 VALUES(1,11); + INSERT INTO t2 VALUES(2,22); + INSERT INTO t2 VALUES(3,33); + SELECT b, a IN (3,4,5) FROM t2 ORDER BY b; +} {11 0 22 0 33 1} +do_execsql_test in-15.2 { + DROP TABLE IF EXISTS t3; + CREATE TABLE t3(x INTEGER PRIMARY KEY); + INSERT INTO t3 VALUES(8); + SELECT CASE WHEN x NOT IN (5,6,7) THEN 'yes' ELSE 'no' END FROM t3; + SELECT CASE WHEN x NOT IN (NULL,6,7) THEN 'yes' ELSE 'no' END FROM t3; +} {yes no} +do_execsql_test in-15.3 { + SELECT CASE WHEN x NOT IN (5,6,7) OR x=0 THEN 'yes' ELSE 'no' END FROM t3; + SELECT CASE WHEN x NOT IN (NULL,6,7) OR x=0 THEN 'yes' ELSE 'no' END FROM t3; +} {yes no} +do_execsql_test in-15.4 { + DROP TABLE IF EXISTS t4; + CREATE TABLE t4(a INTEGER PRIMARY KEY, b INT); + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<20) + INSERT INTO t4(a,b) SELECT x, x+100 FROM c; + SELECT b FROM t4 WHERE a IN (3,null,8) ORDER BY +b; +} {103 108} +do_execsql_test in-15.5 { + SELECT b FROM t4 WHERE a NOT IN (3,null,8); +} {} +do_execsql_test in-15.6 { + DROP TABLE IF EXISTS t5; + DROP TABLE IF EXISTS t6; + CREATE TABLE t5(id INTEGER PRIMARY KEY, name TEXT); + CREATE TABLE t6(id INTEGER PRIMARY KEY, name TEXT, t5_id INT); + INSERT INTO t5 VALUES(1,'Alice'),(2,'Emma'); + INSERT INTO t6 VALUES(1,'Bob',1),(2,'Cindy',1),(3,'Dave',2); + SELECT a.* + FROM t5 AS 'a' JOIN t5 AS 'b' ON b.id=a.id + WHERE b.id IN ( + SELECT t6.t5_id + FROM t6 + WHERE name='Bob' + AND t6.t5_id IS NOT NULL + AND t6.id IN ( + SELECT id + FROM (SELECT t6.id, count(*) AS x + FROM t6 + WHERE name='Bob' + ) AS 't' + WHERE x=1 + ) + AND t6.id IN (1,id) + ); +} {1 Alice} + + finish_test diff --git a/test/where.test b/test/where.test index 1f38065..e1b81aa 100644 --- a/test/where.test +++ b/test/where.test @@ -1425,5 +1425,17 @@ do_execsql_test where-22.1 { SELECT count(*) FROM t1 LEFT JOIN t2 ON a IS NOT NULL; } {5} +# 20190-02-22: A bug introduced by checkin +# https://www.sqlite.org/src/info/fa792714ae62fa98. +# +do_execsql_test where-23.0 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(a INTEGER PRIMARY KEY); + INSERT INTO t1(a) VALUES(1),(2),(3); + CREATE TABLE t2(x INTEGER PRIMARY KEY, y INT); + INSERT INTO t2(y) VALUES(2),(3); + SELECT * FROM t1, t2 WHERE a=y AND y=3; +} {3 2 3} finish_test diff --git a/test/window1.test b/test/window1.test index 2c50420..b307398 100644 --- a/test/window1.test +++ b/test/window1.test @@ -700,5 +700,25 @@ do_execsql_test 16.2 { 3 101 } +#------------------------------------------------------------------------- +do_execsql_test 17.0 { + CREATE TABLE t8(a); + INSERT INTO t8 VALUES(1), (2), (3); +} + +do_execsql_test 17.1 { + SELECT +sum(0) OVER () ORDER BY +sum(0) OVER (); +} {0} + +do_execsql_test 17.2 { + select +sum(a) OVER () FROM t8 ORDER BY +sum(a) OVER () DESC; +} {6 6 6} + +do_execsql_test 17.3 { + SELECT 10+sum(a) OVER (ORDER BY a) + FROM t8 + ORDER BY 10+sum(a) OVER (ORDER BY a) DESC; +} {16 13 11} + finish_test From 82480bfae87097d730bef69071b32dcb47ea7642 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Mon, 25 Feb 2019 15:04:23 -0500 Subject: [PATCH 22/25] update changelog to reference 3.27.2 upstream release --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ed097cf..c02ad08 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ All notable changes to this project will be documented in this file. - PRAGMA fast_kdf_iter is now deprecated - Clear codec data buffers if a crypographic provider operation fails - Disable backup API for encrypted databases (this was previously documented as not-working and non-supported, but will now explicitly error out on initialization) -- Updates baseline to upstream SQLite 3.27.1 +- Updates baseline to upstream SQLite 3.27.2 ## [4.0.1] - 2018-12-17 - Based on upstream SQLite 3.26.0 (addresses SQLite “Magellan” issue) From 9428ef0ed2df48242417ae3e7e6ec8ef079e9f6a Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Tue, 5 Mar 2019 10:57:06 -0500 Subject: [PATCH 23/25] add test to verify temp tables --- test/sqlcipher-core.test | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/sqlcipher-core.test b/test/sqlcipher-core.test index 876423d..63ba1b1 100644 --- a/test/sqlcipher-core.test +++ b/test/sqlcipher-core.test @@ -74,6 +74,23 @@ do_test will-open-with-correct-derived-key { db close file delete -force test.db +# set an encryption key (non-hex) and create +# temp tables, verify you can read from +# sqlite_temp_master +setup test.db "'testkey'" +do_test test-temp-master { + sqlite_orig db test.db + execsql { + PRAGMA key = 'testkey'; + CREATE TEMPORARY TABLE temp_t1(a,b); + INSERT INTO temp_t1(a,b) VALUES ('test1', 'test2'); + SELECT name FROM sqlite_temp_master WHERE type='table'; + SELECT * from temp_t1; + } +} {temp_t1 test1 test2} +db close +file delete -force test.db + # verify that a when a standard database is encrypted the first # 16 bytes are not "SQLite format 3\0" do_test test-sqlcipher-header-overwrite { From 8fe2c3429d5aea03bc2a181086b67d68d921d925 Mon Sep 17 00:00:00 2001 From: Stephen Lombardo Date: Wed, 6 Mar 2019 12:30:31 -0500 Subject: [PATCH 24/25] fix references to refactored struct under CODEC_DEBUG --- src/crypto_impl.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/crypto_impl.c b/src/crypto_impl.c index 8b7f3dd..2f8797c 100644 --- a/src/crypto_impl.c +++ b/src/crypto_impl.c @@ -1106,10 +1106,10 @@ error: static int sqlcipher_cipher_ctx_key_derive(codec_ctx *ctx, cipher_ctx *c_ctx) { int rc; CODEC_TRACE("cipher_ctx_key_derive: entered c_ctx->pass=%s, c_ctx->pass_sz=%d \ - ctx->kdf_salt=%p ctx->kdf_salt_sz=%d c_ctx->kdf_iter=%d \ - ctx->hmac_kdf_salt=%p, c_ctx->fast_kdf_iter=%d ctx->key_sz=%d\n", - c_ctx->pass, c_ctx->pass_sz, ctx->kdf_salt, ctx->kdf_salt_sz, c_ctx->kdf_iter, - ctx->hmac_kdf_salt, c_ctx->fast_kdf_iter, ctx->key_sz); + ctx->kdf_salt=%p ctx->kdf_salt_sz=%d ctx->kdf_iter=%d \ + ctx->hmac_kdf_salt=%p, ctx->fast_kdf_iter=%d ctx->key_sz=%d\n", + c_ctx->pass, c_ctx->pass_sz, ctx->kdf_salt, ctx->kdf_salt_sz, ctx->kdf_iter, + ctx->hmac_kdf_salt, ctx->fast_kdf_iter, ctx->key_sz); if(c_ctx->pass && c_ctx->pass_sz) { /* if key material is present on the context for derivation */ @@ -1130,7 +1130,7 @@ static int sqlcipher_cipher_ctx_key_derive(codec_ctx *ctx, cipher_ctx *c_ctx) { cipher_hex2bin(z, (ctx->key_sz * 2), c_ctx->key); cipher_hex2bin(z + (ctx->key_sz * 2), (ctx->kdf_salt_sz * 2), ctx->kdf_salt); } else { - CODEC_TRACE("cipher_ctx_key_derive: deriving key using full PBKDF2 with %d iterations\n", c_ctx->kdf_iter); + CODEC_TRACE("cipher_ctx_key_derive: deriving key using full PBKDF2 with %d iterations\n", ctx->kdf_iter); if(ctx->provider->kdf(ctx->provider_ctx, ctx->kdf_algorithm, c_ctx->pass, c_ctx->pass_sz, ctx->kdf_salt, ctx->kdf_salt_sz, ctx->kdf_iter, ctx->key_sz, c_ctx->key) != SQLITE_OK) return SQLITE_ERROR; @@ -1156,7 +1156,7 @@ static int sqlcipher_cipher_ctx_key_derive(codec_ctx *ctx, cipher_ctx *c_ctx) { } CODEC_TRACE("cipher_ctx_key_derive: deriving hmac key from encryption key using PBKDF2 with %d iterations\n", - c_ctx->fast_kdf_iter); + ctx->fast_kdf_iter); if(ctx->provider->kdf(ctx->provider_ctx, ctx->kdf_algorithm, c_ctx->key, ctx->key_sz, From 9dd168c7dd91b888b5c5aa581b97f26692c7ee5f Mon Sep 17 00:00:00 2001 From: Nick Parker Date: Fri, 8 Mar 2019 08:25:54 -0600 Subject: [PATCH 25/25] Update changelog header links --- CHANGELOG.md | 115 ++++++++++++++++++++++++++++++++------------------- 1 file changed, 73 insertions(+), 42 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c02ad08..d1d0cb0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ # SQLCipher Change Log All notable changes to this project will be documented in this file. -## [4.1.0] - [unreleased] +## [4.1.0] - (March 2019 - [4.1.0 changes]) - Defer reading salt from header until key derivation is triggered - Clarify usage of sqlite3_rekey for plaintext databases in header - Normalize attach behavior when key is not yet derived @@ -14,14 +14,14 @@ All notable changes to this project will be documented in this file. - Disable backup API for encrypted databases (this was previously documented as not-working and non-supported, but will now explicitly error out on initialization) - Updates baseline to upstream SQLite 3.27.2 -## [4.0.1] - 2018-12-17 +## [4.0.1] - (December 2018 - [4.0.1 changes]) - Based on upstream SQLite 3.26.0 (addresses SQLite “Magellan” issue) - Adds PRAGMA cipher_compatibility and cipher_default_compatibility which take automatcially configure appropriate compatibility settings for the specified SQLCipher major version number - Filters attach statements with KEY parameters from readline history - Fixes crash in command line shell with empty input (i.e. ^D) - Fixes warnings when compiled with strict-prototypes -## [4.0.0] - 2018-11-30 +## [4.0.0] - (November 2018 - [4.0.0 changes]) ### Changed - Default page size for databases increased to 4096 bytes (up from 1024) * - Default PBKDF2 iterations increased to 256,000 (up from 64,000) * @@ -54,7 +54,7 @@ All notable changes to this project will be documented in this file. - Fixes compilation with --disable-amalgamation - Removes sqlcipher.xcodeproj build support -## [3.4.2] - 2017-12-21 +## [3.4.2] - (December 2017 - [3.4.2 changes]) ### Added - Added support for building with LibreSSL @@ -69,14 +69,14 @@ All notable changes to this project will be documented in this file. - Guard OpenSSL initialization and cleanup routines - Allow additional linker options to be passed via command line for Windows platforms -## [3.4.1] - 2016-12-28 +## [3.4.1] - (December 2016 - [3.4.1 changes]) ### Added - Added support for OpenSSL 1.1.0 ### Changed - Merged upstream SQLite 3.15.2 -## [3.4.0] - 2016-04-05 +## [3.4.0] - (April 2016 - [3.4.0 changes]) ### Added - Added `PRAGMA cipher_provider_version` @@ -86,14 +86,14 @@ All notable changes to this project will be documented in this file. ### Deprecated - Deprecated `PRAGMA cipher` command -## [3.3.1] - 2015-07-13 +## [3.3.1] - (July 2015 - [3.3.1 changes]) ### Changed - Merge upstream SQLite 3.8.10.2 - Fixed segfault when provided an invalid cipher name - Check for codec context when performing `PRAGMA cipher_store_pass` - Remove extraneous null check in `PRAGMA cipher_migrate` -## [3.3.0] - 2015-03-25 +## [3.3.0] - (March 2015 - [3.3.0 changes]) ### Added - Added FIPS API calls within the OpenSSL crypto provider - `PRAGMA cipher_default_page_size` - support for attaching non-default page sizes @@ -101,7 +101,7 @@ All notable changes to this project will be documented in this file. ### Changed - Merged upstream SQLite 3.8.8.3 -## [3.2.0] - 2014-09-30 +## [3.2.0] - (September 2014 - [3.2.0 changes]) ### Added - Added `PRAGMA cipher_store_pass` @@ -109,14 +109,14 @@ All notable changes to this project will be documented in this file. - Merged upstream SQLite 3.8.6 - Renmed README to README.md -## [3.1.0] - 2014-04-23 +## [3.1.0] - (April 2014 - [3.1.0 changes]) ### Added - Added `PRAGMA cipher_profile` ### Changed - Merged upstream SQLite 3.8.4.3 -## [3.0.1] - 2013-12-06 +## [3.0.1] - (December 2013 - [3.0.1 changes]) ### Added - Added `PRAGMA cipher_add_random` to source external entropy @@ -124,7 +124,7 @@ All notable changes to this project will be documented in this file. - Fix `PRAGMA cipher_migrate` to handle passphrases longer than 64 characters & raw keys - Improvements to the libtomcrypt provider -## [3.0.0] - 2013-11-05 +## [3.0.0] - (November 2013 - [3.0.0 changes]) ### Added - Added `PRAGMA cipher_migrate` to migrate older database file formats @@ -139,33 +139,64 @@ All notable changes to this project will be documented in this file. ### Security - Change KDF iteration length from 4,000 to 64,000 -[unreleased]: https://github.com/sqlcipher/sqlcipher/compare/v4.0.1...prerelease -[4.0.1]: https://github.com/sqlcipher/sqlcipher/compare/v4.0.0...v4.0.1 -[4.0.0]: https://github.com/sqlcipher/sqlcipher/compare/v3.4.2...v4.0.0 -[3.4.2]: https://github.com/sqlcipher/sqlcipher/compare/v3.4.1...v3.4.2 -[3.4.1]: https://github.com/sqlcipher/sqlcipher/compare/v3.4.0...v3.4.1 -[3.4.0]: https://github.com/sqlcipher/sqlcipher/compare/v3.3.1...v3.4.0 -[3.3.1]: https://github.com/sqlcipher/sqlcipher/compare/v3.3.0...v3.3.1 -[3.3.0]: https://github.com/sqlcipher/sqlcipher/compare/v3.2.0...v3.3.0 -[3.2.0]: https://github.com/sqlcipher/sqlcipher/compare/v3.1.0...v3.2.0 -[3.1.0]: https://github.com/sqlcipher/sqlcipher/compare/v3.0.1...v3.1.0 -[3.0.1]: https://github.com/sqlcipher/sqlcipher/compare/v3.0.0...v3.0.1 -[3.0.0]: https://github.com/sqlcipher/sqlcipher/compare/v2.2.0...v3.0.0 -[2.2.0]: https://github.com/sqlcipher/sqlcipher/compare/v2.1.1...v2.2.0 -[2.1.1]: https://github.com/sqlcipher/sqlcipher/compare/v2.1.0...v2.1.1 -[2.1.0]: https://github.com/sqlcipher/sqlcipher/compare/v2.0.6...v2.1.0 -[2.0.6]: https://github.com/sqlcipher/sqlcipher/compare/v2.0.5...v2.0.6 -[2.0.5]: https://github.com/sqlcipher/sqlcipher/compare/v2.0.3...v2.0.5 -[2.0.3]: https://github.com/sqlcipher/sqlcipher/compare/v2.0.0...v2.0.3 -[2.0.0]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.10...v2.0.0 -[1.1.10]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.9...v1.1.10 -[1.1.9]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.8...v1.1.9 -[1.1.8]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.7...v1.1.8 -[1.1.7]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.6...v1.1.7 -[1.1.6]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.5...v1.1.6 -[1.1.5]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.4...v1.1.5 -[1.1.4]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.3...v1.1.4 -[1.1.3]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.2...v1.1.3 -[1.1.2]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.1...v1.1.1 -[1.1.1]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.0...v1.1.1 -[1.1.0]: https://github.com/sqlcipher/sqlcipher/compare/617ed01...v1.1.0 +[unreleased]: https://github.com/sqlcipher/sqlcipher/compare/v4.1.0...prerelease +[4.1.0]: https://github.com/sqlcipher/sqlcipher/tree/v4.1.0 +[4.1.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.0.1...v4.1.0 +[4.0.1]: https://github.com/sqlcipher/sqlcipher/tree/v4.0.1 +[4.0.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v4.0.0...v4.0.1 +[4.0.0]: https://github.com/sqlcipher/sqlcipher/tree/v4.0.0 +[4.0.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.4.2...v4.0.0 +[3.4.2]: https://github.com/sqlcipher/sqlcipher/tree/v3.4.2 +[3.4.2 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.4.1...v3.4.2 +[3.4.1]: https://github.com/sqlcipher/sqlcipher/tree/v3.4.1 +[3.4.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.4.0...v3.4.1 +[3.4.0]: https://github.com/sqlcipher/sqlcipher/tree/v3.4.0 +[3.4.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.3.1...v3.4.0 +[3.3.1]: https://github.com/sqlcipher/sqlcipher/tree/v3.3.1 +[3.3.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.3.0...v3.3.1 +[3.3.0]: https://github.com/sqlcipher/sqlcipher/tree/v3.3.0 +[3.3.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.2.0...v3.3.0 +[3.2.0]: https://github.com/sqlcipher/sqlcipher/tree/v3.2.0 +[3.2.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.1.0...v3.2.0 +[3.1.0]: https://github.com/sqlcipher/sqlcipher/tree/v3.1.0 +[3.1.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.0.1...v3.1.0 +[3.0.1]: https://github.com/sqlcipher/sqlcipher/tree/v3.0.1 +[3.0.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v3.0.0...v3.0.1 +[3.0.0]: https://github.com/sqlcipher/sqlcipher/tree/v3.0.0 +[3.0.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.2.0...v3.0.0 +[2.2.0]: https://github.com/sqlcipher/sqlcipher/tree/v2.2.0 +[2.2.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.1.1...v2.2.0 +[2.1.1]: https://github.com/sqlcipher/sqlcipher/tree/v2.1.1 +[2.1.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.1.0...v2.1.1 +[2.1.0]: https://github.com/sqlcipher/sqlcipher/tree/v2.1.0 +[2.1.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.0.6...v2.1.0 +[2.0.6]: https://github.com/sqlcipher/sqlcipher/tree/v2.0.6 +[2.0.6 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.0.5...v2.0.6 +[2.0.5]: https://github.com/sqlcipher/sqlcipher/tree/v2.0.5 +[2.0.5 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.0.3...v2.0.5 +[2.0.3]: https://github.com/sqlcipher/sqlcipher/tree/v2.0.3 +[2.0.3 changes]: https://github.com/sqlcipher/sqlcipher/compare/v2.0.0...v2.0.3 +[2.0.0]: https://github.com/sqlcipher/sqlcipher/tree/v2.0.0 +[2.0.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.10...v2.0.0 +[1.1.10]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.10 +[1.1.10 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.9...v1.1.10 +[1.1.9]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.9 +[1.1.9 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.8...v1.1.9 +[1.1.8]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.8 +[1.1.8 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.7...v1.1.8 +[1.1.7]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.7 +[1.1.7 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.6...v1.1.7 +[1.1.6]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.6 +[1.1.6 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.5...v1.1.6 +[1.1.5]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.5 +[1.1.5 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.4...v1.1.5 +[1.1.4]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.4 +[1.1.4 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.3...v1.1.4 +[1.1.3]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.3 +[1.1.3 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.2...v1.1.3 +[1.1.2]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.2 +[1.1.2 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.1...v1.1.1 +[1.1.1]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.1 +[1.1.1 changes]: https://github.com/sqlcipher/sqlcipher/compare/v1.1.0...v1.1.1 +[1.1.0]: https://github.com/sqlcipher/sqlcipher/tree/v1.1.0 +[1.1.0 changes]: https://github.com/sqlcipher/sqlcipher/compare/617ed01...v1.1.0

    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�@+=9WgR>IW^h;6C9!s3r`8BR2jPJu8|oJ1 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�ydkNPkFXUi1Vr+0))j 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 z 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 CgHWCT literal 0 HcmV?d00001 diff --git a/test/index6.test b/test/index6.test index 4ddce45..29b73f7 100644 --- a/test/index6.test +++ b/test/index6.test @@ -389,6 +389,25 @@ do_execsql_test index6-11.1 { do_execsql_test index6-11.2 { EXPLAIN QUERY PLAN SELECT a FROM t11 WHERE b<>99 AND c<>98; } {/USING INDEX t11x/} - +# 2018-12-08 +# Ticket https://www.sqlite.org/src/info/1d958d90596593a7 +# NOT IN operator fails when using a partial index. +# +do_execsql_test index6-12.1 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(a,b); + INSERT INTO t1 VALUES(1,1); + INSERT INTO t1 VALUES(2,2); + CREATE TABLE t2(x); + INSERT INTO t2 VALUES(1); + INSERT INTO t2 VALUES(2); + SELECT 'one', * FROM t2 WHERE x NOT IN (SELECT a FROM t1); + CREATE INDEX t1a ON t1(a) WHERE b=1; + SELECT 'two', * FROM t2 WHERE x NOT IN (SELECT a FROM t1); +} {} +do_execsql_test index6-12.2 { + SELECT x FROM t2 WHERE x IN (SELECT a FROM t1) ORDER BY +x; +} {1 2} finish_test diff --git a/test/indexexpr2.test b/test/indexexpr2.test index 79a6456..8d6e591 100644 --- a/test/indexexpr2.test +++ b/test/indexexpr2.test @@ -231,5 +231,52 @@ ifcapable vtab { } {t2 t2abc t2cd t2def} } +#------------------------------------------------------------------------- +# Test that ticket [d96eba87] has been fixed. +# +do_execsql_test 5.0 { + CREATE TABLE t5(a INTEGER, b INTEGER); + INSERT INTO t5 VALUES(2, 4), (3, 9); +} +do_execsql_test 5.1 { + SELECT * FROM t5 WHERE abs(a)=2 or abs(b)=9; +} {2 4 3 9} +do_execsql_test 5.2 { + CREATE INDEX t5a ON t5( abs(a) ); + CREATE INDEX t5b ON t5( abs(b) ); +} +do_execsql_test 5.4 { + SELECT * FROM t5 WHERE abs(a)=2 or abs(b)=9; +} {2 4 3 9} + +#------------------------------------------------------------------------- +do_execsql_test 6.0 { + CREATE TABLE x1(a INTEGER PRIMARY KEY, b); + INSERT INTO x1 VALUES + (1, 123), (2, '123'), (3, '123abc'), (4, 123.0), (5, 1234); +} + +do_execsql_test 6.1.1 { + SELECT a, b FROM x1 WHERE CAST(b AS INTEGER) = 123; +} {1 123 2 123 3 123abc 4 123.0} +do_execsql_test 6.1.2 { + CREATE INDEX x1i ON x1( CAST(b AS INTEGER) ); + SELECT a, b FROM x1 WHERE CAST(b AS INTEGER) = 123; +} {1 123 2 123 3 123abc 4 123.0} +do_eqp_test 6.1.3 { + SELECT a, b FROM x1 WHERE CAST(b AS INTEGER) = 123; +} {SEARCH TABLE x1 USING INDEX x1i (=?)} + +do_execsql_test 6.2.1 { + SELECT a, b FROM x1 WHERE CAST(b AS TEXT) = 123; +} {1 123 2 123} +do_execsql_test 6.2.2 { + CREATE INDEX x1i2 ON x1( CAST(b AS TEXT) ); + SELECT a, b FROM x1 WHERE CAST(b AS TEXT) = 123; +} {1 123 2 123} +do_eqp_test 6.2.3 { + SELECT a, b FROM x1 WHERE CAST(b AS TEXT) = 123; +} {SEARCH TABLE x1 USING INDEX x1i2 (=?)} + finish_test diff --git a/test/insert.test b/test/insert.test index 1337105..01c7016 100644 --- a/test/insert.test +++ b/test/insert.test @@ -449,6 +449,15 @@ do_execsql_test insert-13.1 { SELECT * FROM t13 ORDER BY +b; } {2 0 6 2 1 5} +# 2019-01-17. From the chromium fuzzer. +# +do_execsql_test insert-14.1 { + DROP TABLE IF EXISTS t14; + CREATE TABLE t14(x INTEGER PRIMARY KEY); + INSERT INTO t14 VALUES(CASE WHEN 1 THEN null END); + SELECT x FROM t14; +} {1} + integrity_check insert-99.0 finish_test diff --git a/test/insertfault.test b/test/insertfault.test new file mode 100644 index 0000000..53849a1 --- /dev/null +++ b/test/insertfault.test @@ -0,0 +1,36 @@ +# 2019-01-26 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# Test cases for INSERT + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix insertfault + +do_execsql_test 1.0 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b, c, d DEFAULT true); + INSERT INTO t1 DEFAULT VALUES; + SELECT * FROM t1; +} {1 {} {} 1} +faultsim_save_and_close + +breakpoint +do_faultsim_test 1 -faults oom* -prep { + faultsim_restore_and_reopen + db eval { SELECT * FROM sqlite_master } +} -body { + execsql { SELECT * FROM t1 } +} -test { + faultsim_test_result {0 {1 {} {} 1}} +} + + +finish_test diff --git a/test/join.test b/test/join.test index 8c6f463..f613df8 100644 --- a/test/join.test +++ b/test/join.test @@ -671,20 +671,26 @@ jointest join-12.5 65 {1 {at most 64 tables in a join}} jointest join-12.6 66 {1 {at most 64 tables in a join}} jointest join-12.7 127 {1 {at most 64 tables in a join}} jointest join-12.8 128 {1 {at most 64 tables in a join}} -jointest join-12.9 1000 {1 {at most 64 tables in a join}} -# If SQLite is built with SQLITE_MEMDEBUG, then the huge number of realloc() -# calls made by the following test cases are too time consuming to run. -# Without SQLITE_MEMDEBUG, realloc() is fast enough that these are not -# a problem. -ifcapable pragma&&compileoption_diags { - if {[lsearch [db eval {PRAGMA compile_options}] MEMDEBUG]<0} { - jointest join-12.10 65534 {1 {at most 64 tables in a join}} - jointest join-12.11 65535 {1 {too many references to "t14": max 65535}} - jointest join-12.12 65536 {1 {too many references to "t14": max 65535}} - jointest join-12.13 65537 {1 {too many references to "t14": max 65535}} - } -} +# As of 2019-01-17, the number of elements in a SrcList is limited +# to 200. The following tests still run, but the answer is now +# an SQLITE_NOMEM error. +# +# jointest join-12.9 1000 {1 {at most 64 tables in a join}} +# +# If SQLite is built with SQLITE_MEMDEBUG, then the huge number of realloc() +# calls made by the following test cases are too time consuming to run. +# Without SQLITE_MEMDEBUG, realloc() is fast enough that these are not +# a problem. +# +# ifcapable pragma&&compileoption_diags { +# if {[lsearch [db eval {PRAGMA compile_options}] MEMDEBUG]<0} { +# jointest join-12.10 65534 {1 {at most 64 tables in a join}} +# jointest join-12.11 65535 {1 {too many references to "t14": max 65535}} +# jointest join-12.12 65536 {1 {too many references to "t14": max 65535}} +# jointest join-12.13 65537 {1 {too many references to "t14": max 65535}} +# } +# } #------------------------------------------------------------------------- @@ -844,4 +850,18 @@ do_execsql_test join-15.110 { ORDER BY a1, a2, a3, a4, a5; } {1 {} {} {} {} 1 11 {} {} {} 1 12 {} {} {} 1 12 121 {} {} 1 13 {} {} {}} +# 2019-02-05 Ticket https://www.sqlite.org/src/tktview/5948e09b8c415bc45da5c +# Error in join due to the LEFT JOIN strength reduction optimization. +# +do_execsql_test join-16.100 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(a INT); + INSERT INTO t1(a) VALUES(1); + CREATE TABLE t2(b INT); + SELECT a, b + FROM t1 LEFT JOIN t2 ON 0 + WHERE (b IS NOT NULL)=0; +} {1 {}} + finish_test diff --git a/test/join5.test b/test/join5.test index 2df66e7..f4ded79 100644 --- a/test/join5.test +++ b/test/join5.test @@ -241,6 +241,18 @@ do_execsql_test 6.3.2 { SELECT ifnull(z, '!!!') FROM t3 LEFT JOIN t4 ON (x=y); } {!!!} +# 2019-02-08 https://sqlite.org/src/info/4e8e4857d32d401f +reset_db +do_execsql_test 6.100 { + CREATE TABLE t1(aa, bb); + CREATE INDEX t1x1 on t1(abs(aa), abs(bb)); + INSERT INTO t1 VALUES(-2,-3),(+2,-3),(-2,+3),(+2,+3); + SELECT * FROM (t1) + WHERE ((abs(aa)=1 AND 1=2) OR abs(aa)=2) + AND abs(bb)=3 + ORDER BY +1, +2; +} {-2 -3 -2 3 2 -3 2 3} + #------------------------------------------------------------------------- # reset_db @@ -267,8 +279,10 @@ do_eqp_test 7.2 { QUERY PLAN |--SCAN TABLE t1 `--MULTI-INDEX OR - |--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?) - `--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?) + |--INDEX 1 + | `--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?) + `--INDEX 2 + `--SEARCH TABLE t2 USING INDEX t2xy (x=? AND y=?) } do_execsql_test 7.3 { diff --git a/test/json101.test b/test/json101.test index 9a93ee7..534478d 100644 --- a/test/json101.test +++ b/test/json101.test @@ -813,6 +813,23 @@ do_execsql_test json-14.170 { SELECT fullkey FROM json_tree('null'); } {$} - +# 2018-12-03 +# Make sure the table-valued functions contained within parentheses +# work correctly. +# +# Bug reported via private email. See TH3 for more information. +# +do_execsql_test json-15.100 { + SELECT * FROM JSON_EACH('{"a":1, "b":2}'); +} {a 1 integer 1 2 {} {$.a} {$} b 2 integer 2 4 {} {$.b} {$}} +do_execsql_test json-15.110 { + SELECT xyz.* FROM JSON_EACH('{"a":1, "b":2}') AS xyz; +} {a 1 integer 1 2 {} {$.a} {$} b 2 integer 2 4 {} {$.b} {$}} +do_execsql_test json-15.120 { + SELECT * FROM (JSON_EACH('{"a":1, "b":2}')); +} {a 1 integer 1 2 {} {$.a} {$} b 2 integer 2 4 {} {$.b} {$}} +do_execsql_test json-15.130 { + SELECT xyz.* FROM (JSON_EACH('{"a":1, "b":2}')) AS xyz; +} {a 1 integer 1 2 {} {$.a} {$} b 2 integer 2 4 {} {$.b} {$}} finish_test diff --git a/test/lock_common.tcl b/test/lock_common.tcl index a758e7a..3e1821b 100644 --- a/test/lock_common.tcl +++ b/test/lock_common.tcl @@ -15,18 +15,20 @@ proc do_multiclient_test {varname script} { - foreach code [list { + foreach {tn code} [list 1 { if {[info exists ::G(valgrind)]} { db close ; continue } set ::code2_chan [launch_testfixture] set ::code3_chan [launch_testfixture] proc code2 {tcl} { testfixture $::code2_chan $tcl } proc code3 {tcl} { testfixture $::code3_chan $tcl } - set tn 1 - } { + } 2 { proc code2 {tcl} { uplevel #0 $tcl } proc code3 {tcl} { uplevel #0 $tcl } - set tn 2 }] { + # Do not run multi-process tests with the unix-excl VFS. + # + if {$tn==1 && [permutation]=="unix-excl"} continue + faultsim_delete_and_reopen proc code1 {tcl} { uplevel #0 $tcl } diff --git a/test/memdb1.test b/test/memdb1.test index 771d5e4..3d1a1f9 100644 --- a/test/memdb1.test +++ b/test/memdb1.test @@ -72,6 +72,31 @@ do_execsql_test 140 { PRAGMA page_count; } {2} +do_test 150 { + catch {db deserialize -unknown 1 $db1} msg + set msg +} {unknown option: -unknown} +do_test 151 { + db deserialize -readonly 1 $db1 + db eval {SELECT * FROM t1} +} {1 2} +do_test 152 { + catchsql {INSERT INTO t1 VALUES(3,4);} +} {1 {attempt to write a readonly database}} + +breakpoint +do_test 160 { + db deserialize -maxsize 32768 $db1 + db eval {SELECT * FROM t1} +} {1 2} +do_test 161 { + db eval {INSERT INTO t1 VALUES(3,4); SELECT * FROM t1} +} {1 2 3 4} +do_test 162 { + catchsql {INSERT INTO t1 VALUES(5,randomblob(100000))} +} {1 {database or disk is full}} + + # Build a largish on-disk database and serialize it. Verify that the # serialization works. # @@ -154,7 +179,7 @@ do_test 600 { do_test 610 { set rc [catch {db deserialize a b c} msg] lappend rc $msg -} {1 {wrong # args: should be "db deserialize ?DATABASE? VALUE"}} +} {1 {unknown option: a}} do_test 620 { set rc [catch {db serialize a b} msg] lappend rc $msg diff --git a/test/misc1.test b/test/misc1.test index 9ac52e4..c14a31e 100644 --- a/test/misc1.test +++ b/test/misc1.test @@ -744,5 +744,19 @@ do_execsql_test misc1-27.1 { SELECT a,b,c FROM dup1; } {10 11 12} +# 2018-12-20 +# +# The Cursor.seekOp debugging value set incorrectly +# in OP_NotExists. +# +sqlite3 db :memory: +do_execsql_test misc1-28.0 { + CREATE TABLE t1(x); + CREATE UNIQUE INDEX t1x ON t1(x) WHERE x=1; + INSERT OR ABORT INTO t1 DEFAULT VALUES; + UPDATE OR REPLACE t1 SET x = 1; + PRAGMA integrity_check; + SELECT * FROM t1; +} {ok 1} finish_test diff --git a/test/misc7.test b/test/misc7.test index 5ae8178..e75a684 100644 --- a/test/misc7.test +++ b/test/misc7.test @@ -227,6 +227,9 @@ ifcapable vtab { } } {1} set sqlite_where_trace 0 + do_catchsql_test misc7-10.1 { + INSERT INTO t1(a,b,c) VALUES(12345,2,3) ON CONFLICT(a) DO NOTHING; + } {1 {UPSERT not implemented for virtual table "t1"}} # Specify an ORDER BY clause that cannot be indexed. do_test misc7-11 { diff --git a/test/normalize.test b/test/normalize.test index e85bd00..8b0c7ed 100644 --- a/test/normalize.test +++ b/test/normalize.test @@ -86,7 +86,7 @@ do_test 201 { } {} do_test 202 { sqlite3_normalized_sql $STMT -} {} +} {SELECT a,b FROM t1 WHERE b=?ORDER BY a;} do_test 203 { sqlite3_finalize $STMT } {SQLITE_OK} @@ -207,7 +207,7 @@ foreach {tnum sql flags norm} { 430 {SELECT "a" FROM t1 WHERE "x" IN ("1","2",'3');} 0x2 - {0 {SELECT"a"FROM t1 WHERE"x"IN(?,?,?);}} + {0 {SELECT a FROM t1 WHERE x IN(?,?,?);}} 440 {SELECT 'a' FROM t1 WHERE 'x';} @@ -217,7 +217,7 @@ foreach {tnum sql flags norm} { 450 {SELECT [a] FROM t1 WHERE [x];} 0x2 - {0 {SELECT"a"FROM t1 WHERE"x";}} + {0 {SELECT a FROM t1 WHERE x;}} 460 {SELECT * FROM t1 WHERE x IN (x);} @@ -232,12 +232,12 @@ foreach {tnum sql flags norm} { 480 {SELECT * FROM t1 WHERE x IN ([x],"a");} 0x2 - {0 {SELECT*FROM t1 WHERE x IN("x","a");}} + {0 {SELECT*FROM t1 WHERE x IN(x,a);}} 500 {SELECT * FROM t1 WHERE x IN ([x],"a",'b',sqlite_version());} 0x2 - {0 {SELECT*FROM t1 WHERE x IN("x","a",?,sqlite_version());}} + {0 {SELECT*FROM t1 WHERE x IN(x,a,?,sqlite_version());}} 520 {SELECT * FROM t1 WHERE x IN (SELECT x FROM t1);} @@ -247,12 +247,12 @@ foreach {tnum sql flags norm} { 540 {SELECT * FROM t1 WHERE x IN ((SELECT x FROM t1));} 0x2 - {0 {SELECT*FROM t1 WHERE x IN(?,?,?);}} + {0 {SELECT*FROM t1 WHERE x IN((SELECT x FROM t1));}} 550 {SELECT a, a+1, a||'b', a+"b" FROM t1;} 0x2 - {0 {SELECT a,a+?,a||?,a+"b"FROM t1;}} + {0 {SELECT a,a+?,a||?,a+b FROM t1;}} 570 {SELECT * FROM t1 WHERE x IN (1);} @@ -316,7 +316,7 @@ foreach {tnum sql flags norm} { 680 {SELECT a, "col f" FROM t1 LEFT OUTER JOIN t2 ON [t1].[col f] == [t2].[col y];} 0x2 - {0 {SELECT a,"col f"FROM t1 LEFT OUTER JOIN t2 ON"t1"."col f"=="t2"."col y";}} + {0 {SELECT a,"col f"FROM t1 LEFT OUTER JOIN t2 ON t1."col f"==t2."col y";}} 690 {SELECT * FROM ( WITH x AS ( SELECT * FROM t1 WHERE x IN ( 1)) SELECT 10);} @@ -346,7 +346,7 @@ foreach {tnum sql flags norm} { 760 {SELECT x FROM t1 WHERE x IN ([x] IS NOT NULL, NULL, 1, 'a', "b", x'00');} 0x2 - {0 {SELECT x FROM t1 WHERE x IN("x"IS NOT NULL,?,?,?,"b",?);}} + {0 {SELECT x FROM t1 WHERE x IN(x IS NOT NULL,?,?,?,b,?);}} } { do_test $tnum { set code [catch { diff --git a/test/ossfuzz.c b/test/ossfuzz.c index c3d66eb..3b1017f 100644 --- a/test/ossfuzz.c +++ b/test/ossfuzz.c @@ -155,6 +155,11 @@ int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { /* Set a limit on the maximum size of a prepared statement */ sqlite3_limit(cx.db, SQLITE_LIMIT_VDBE_OP, 25000); + /* Set a limit on the maximum length of a string or BLOB. Without this + ** limit, fuzzers will invoke randomblob(N) for a large N, and the process + ** will timeout trying to generate the huge blob */ + sqlite3_limit(cx.db, SQLITE_LIMIT_LENGTH, 50000); + /* Bit 1 of the selector enables foreign key constraints */ sqlite3_db_config(cx.db, SQLITE_DBCONFIG_ENABLE_FKEY, uSelector&1, &rc); uSelector >>= 1; diff --git a/test/permutations.test b/test/permutations.test index 6aa812e..577cc7b 100644 --- a/test/permutations.test +++ b/test/permutations.test @@ -430,10 +430,18 @@ lappend ::testsuitelist xxx test_suite "coverage-wal" -description { Coverage tests for file wal.c. } -files { - wal.test wal2.test wal3.test walmode.test - walbak.test walhook.test walcrash2.test walcksum.test - walfault.test walbig.test walnoshm.test - wal5.test + wal.test wal2.test wal3.test wal4.test wal5.test + wal64k.test wal6.test wal7.test wal8.test wal9.test + walbak.test walbig.test walblock.test walcksum.test walcrash2.test + walcrash3.test walcrash4.test walcrash.test walfault.test walhook.test + walmode.test walnoshm.test waloverwrite.test walpersist.test + walprotocol2.test walprotocol.test walro2.test walrofault.test + walro.test walshared.test walslow.test walvfs.test + walfault2.test + nockpt.test + + snapshot2.test snapshot3.test snapshot4.test + snapshot_fault.test snapshot.test snapshot_up.test } test_suite "coverage-pager" -description { @@ -744,7 +752,7 @@ test_suite "inmemory_journal" -description { # the number of fsync() calls. pager.test exclusive.test jrnlmode.test sync.test misc1.test journal1.test conflict.test crash8.test tkt3457.test io.test - journal3.test 8_3_names.test + journal3.test 8_3_names.test shmlock.test pager1.test async4.test corrupt.test filefmt.test pager2.test corrupt5.test corruptA.test pageropt.test @@ -958,7 +966,7 @@ test_suite "journaltest" -description { async4.test bigfile.test backcompat.test e_wal* fstat.test mmap2.test pager1.test syscall.test tkt3457.test *malloc* mmap* multiplex* nolock* pager2.test *fault* rowal* snapshot* superlock* symlink.test - delete_db.test + delete_db.test shmlock.test }] if {[info commands register_demovfs] != ""} { diff --git a/test/prefixes.test b/test/prefixes.test new file mode 100644 index 0000000..2080905 --- /dev/null +++ b/test/prefixes.test @@ -0,0 +1,88 @@ +# 2018-01-15 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. The +# focus of this file is prefixes.c extension +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +set testprefix unionvtab + +ifcapable !vtab { + finish_test + return +} + +load_static_extension db prefixes + +foreach {tn zLeft zRight expected} { + 1 abcdxxx abcyy 3 + 2 abcdxxx bcyyy 0 + 3 abcdxxx ab 2 + 4 ab abcd 2 + + 5 "xyz\u1234xz" "xyz\u1234xy" 5 + 6 "xyz\u1234" "xyz\u1234xy" 4 + 7 "xyz\u1234" "xyz\u1234" 4 + 8 "xyz\u1234xy" "xyz\u1234" 4 + 9 "xyz\u1234xy" "xyz\u1233" 3 + 10 "xyz\u1234xy" "xyz\u1235" 3 +} { + do_execsql_test 1.$tn { SELECT prefix_length($zLeft, $zRight) } $expected +} + + +do_execsql_test 2.0 { + CREATE TABLE t1(k TEXT UNIQUE, v INTEGER); + INSERT INTO t1 VALUES + ('aback', 1), + ('abaft', 2), + ('abandon', 3), + ('abandoned', 4), + ('abandoning', 5), + ('abandonment', 6), + ('abandons', 7), + ('abase', 8), + ('abased', 9), + ('abasement', 10), + ('abasements', 11), + ('abases', 12), + ('abash', 13), + ('abashed', 14), + ('abashes', 15), + ('abashing', 16), + ('abasing', 17), + ('abate', 18), + ('abated', 19), + ('abatement', 20), + ('abatements', 21); +} + +foreach {tn INPUT expected} { + 1 abatementt abatement + 2 abashet abash + 3 abandonio abandon + 4 abasemenu abase +} { + do_execsql_test 2.$tn { + WITH finder(str) AS ( + SELECT (SELECT max(k) FROM t1 WHERE k<=$INPUT) + UNION ALL + SELECT ( + SELECT max(k) FROM t1 + WHERE k<=substr($INPUT, 1, prefix_length(finder.str, $INPUT)) + ) FROM finder WHERE length(finder.str)>0 + ) + SELECT str FROM finder WHERE length(str)==prefix_length(str, $INPUT) LIMIT 1 + } $expected +} + +finish_test diff --git a/test/releasetest.tcl b/test/releasetest.tcl index 55c5a60..c520a53 100755 --- a/test/releasetest.tcl +++ b/test/releasetest.tcl @@ -50,6 +50,7 @@ array set ::Configs [strip_comments { -O2 --disable-amalgamation --disable-shared --enable-session + -DSQLITE_ENABLE_DESERIALIZE } "Sanitize" { CC=clang -fsanitize=undefined diff --git a/test/resetdb.test b/test/resetdb.test index de2dfcf..bdb8354 100644 --- a/test/resetdb.test +++ b/test/resetdb.test @@ -70,12 +70,12 @@ do_test 200 { UPDATE sqlite_dbpage SET data=randomblob(4096) WHERE pgno=1; PRAGMA quick_check; } -} {1 {unsupported file format}} +} {1 {file is not a database}} do_test 201 { catchsql { PRAGMA quick_check; } db2 -} {1 {unsupported file format}} +} {1 {file is not a database}} do_test 210 { # Reset the database file using SQLITE_DBCONFIG_RESET_DATABASE @@ -83,6 +83,10 @@ do_test 210 { db eval VACUUM sqlite3_db_config db RESET_DB 0 + # If using sqlite3_prepare() instead of _v2() or _v3(), the block + # below raises an SQLITE_SCHEMA error. The following fixes this. + if {[permutation]=="prepare"} { catchsql "SELECT * FROM sqlite_master" db2 } + # Verify that the reset took, even on the separate database connection catchsql { PRAGMA page_count; diff --git a/test/rowvalue4.test b/test/rowvalue4.test index 5c0d170..2929a97 100644 --- a/test/rowvalue4.test +++ b/test/rowvalue4.test @@ -235,9 +235,9 @@ do_eqp_test 5.1 { } { QUERY PLAN |--SEARCH TABLE d2 USING INDEX d2ab (a=? AND b=?) - |--LIST SUBQUERY + |--LIST SUBQUERY xxxxxx | `--SCAN TABLE d1 - `--LIST SUBQUERY + `--LIST SUBQUERY xxxxxx `--SCAN TABLE d1 } diff --git a/test/select1.test b/test/select1.test index 7023a6e..468f118 100644 --- a/test/select1.test +++ b/test/select1.test @@ -1080,5 +1080,24 @@ do_test select1-16.1 { do_catchsql_test select1-16.2 { SELECT 1 FROM sqlite_master LIMIT 1,#1; } {1 {near "#1": syntax error}} - + +# 2019-01-16 Chromium bug 922312 +# Sorting with a LIMIT clause using SRT_EphemTab and SRT_Table +# +do_execsql_test select1-17.1 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(x); INSERT INTO t1 VALUES(1); + CREATE TABLE t2(y,z); INSERT INTO t2 VALUES(2,3); + CREATE INDEX t2y ON t2(y); + SELECT * FROM t1,(SELECT * FROM t2 WHERE y=2 ORDER BY y,z); +} {1 2 3} +do_execsql_test select1-17.2 { + SELECT * FROM t1,(SELECT * FROM t2 WHERE y=2 ORDER BY y,z LIMIT 4); +} {1 2 3} +do_execsql_test select1-17.3 { + SELECT * FROM t1,(SELECT * FROM t2 WHERE y=2 + UNION ALL SELECT * FROM t2 WHERE y=3 ORDER BY y,z LIMIT 4); +} {1 2 3} + finish_test diff --git a/test/shell1.test b/test/shell1.test index aaf7add..f105bac 100644 --- a/test/shell1.test +++ b/test/shell1.test @@ -256,7 +256,7 @@ do_test shell1-3.1.3 { do_test shell1-3.1.4 { # too many arguments catchcmd "test.db" ".backup FOO BAR BAD" -} {1 {Usage: .backup ?DB? ?--append? FILENAME}} +} {1 {Usage: .backup ?DB? ?OPTIONS? FILENAME}} # .bail ON|OFF Stop after hitting an error. Default OFF do_test shell1-3.2.1 { diff --git a/test/shell4.test b/test/shell4.test index 88e5e69..386e51f 100644 --- a/test/shell4.test +++ b/test/shell4.test @@ -106,16 +106,16 @@ SELECT 1; [regexp {Autoindex Inserts} $res] } {1 1 1} +ifcapable trace { do_test shell4-2.1 { - catchcmd ":memory:" "CREATE TABLE t1(x);\n.trace" -} {1 {Usage: .trace FILE|off}} + catchcmd ":memory:" "CREATE TABLE t1(x);\n.trace --unknown" +} {1 {Unknown option "--unknown" on ".trace"}} do_test shell4-2.2 { catchcmd ":memory:" "CREATE TABLE t1(x);\n.trace off\n.trace off\n" } {0 {}} do_test shell4-2.3 { - catchcmd ":memory:" ".trace stdout\n.trace\n.trace off\n.dump\n" -} {/^1 {PRAGMA.*Usage:.*}$/} -ifcapable trace { + catchcmd ":memory:" ".trace stdout\n.dump\n.trace off\n" +} {/^0 {PRAGMA.*}$/} do_test shell4-2.4 { catchcmd ":memory:" ".trace stdout\nCREATE TABLE t1(x);SELECT * FROM t1;" } {0 {CREATE TABLE t1(x); diff --git a/test/shmlock.test b/test/shmlock.test new file mode 100644 index 0000000..89b29fd --- /dev/null +++ b/test/shmlock.test @@ -0,0 +1,180 @@ +# 2018 December 6 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +set testprefix shmlock + +ifcapable !wal {finish_test ; return } + +sqlite3 db2 test.db +sqlite3 db3 test.db + +do_execsql_test 1.0 { + PRAGMA journal_mode = wal; + CREATE TABLE t1(a, b); + INSERT INTO t1 VALUES(1, 2); +} {wal} +do_test 1.1 { execsql { SELECT * FROM t1 } db2 } {1 2} +do_test 1.2 { execsql { SELECT * FROM t1 } db3 } {1 2} + +foreach {tn dbhandle cmd res} { + 1 db {shared lock 7 1} OK + 2 db2 {exclusive lock 7 1} BUSY + 3 db {shared unlock 7 1} OK + 4 db2 {exclusive lock 7 1} OK + 5 db {shared lock 7 1} BUSY + 6 db {exclusive lock 7 1} BUSY + 7 db2 {exclusive unlock 7 1} OK + + 8 db {exclusive lock 0 8} OK + 9 db {exclusive unlock 0 8} OK + 10 db2 {exclusive lock 0 8} OK + 11 db2 {exclusive unlock 0 8} OK + + 12 db {shared lock 0 1} OK + 13 db2 {shared lock 0 1} OK + 14 db3 {shared lock 0 1} OK + 15 db3 {shared unlock 0 1} OK + 16 db3 {exclusive lock 0 1} BUSY + 17 db2 {shared unlock 0 1} OK + 18 db3 {exclusive lock 0 1} BUSY + 19 db {shared unlock 0 1} OK + 20 db3 {exclusive lock 0 1} OK + 21 db3 {exclusive unlock 0 1} OK + + 22 db {shared lock 3 1} OK + 23 db2 {exclusive lock 2 2} BUSY + 24 db {shared lock 2 1} OK + 25 db2 {exclusive lock 0 5} BUSY + 26 db2 {exclusive lock 0 4} BUSY + 27 db2 {exclusive lock 0 3} BUSY + 28 db {shared unlock 3 1} OK + 29 db2 {exclusive lock 2 2} BUSY + 28 db {shared unlock 2 1} OK + 29 db2 {exclusive lock 2 2} OK + 29 db2 {exclusive unlock 2 2} OK +} { + do_test 1.3.$tn [list vfs_shmlock $dbhandle main {*}$cmd] "SQLITE_$res" +} + +db close +db2 close +db3 close + +if {[permutation]=="unix-excl"} { + do_test 2.0 { + for {set i 0} {$i < 256} {incr i} { + sqlite3 db$i test.db + execsql { SELECT * FROM t1 } db$i + } + for {set i 0} {$i < 255} {incr i} { + set rc [vfs_shmlock db$i main shared lock 4 1] + if {$rc != "SQLITE_OK"} { error $rc } + } + + vfs_shmlock db255 main shared lock 4 1 + } {SQLITE_BUSY} + + do_test 2.1 { vfs_shmlock db255 main exclusive lock 4 1 } SQLITE_BUSY + do_test 2.2 { vfs_shmlock db0 main shared unlock 4 1 } SQLITE_OK + do_test 2.3 { vfs_shmlock db255 main shared lock 4 1 } SQLITE_OK + do_test 2.4 { vfs_shmlock db255 main shared unlock 4 1 } SQLITE_OK + do_test 2.5 { vfs_shmlock db255 main exclusive lock 4 1 } SQLITE_BUSY + + do_test 2.6 { + for {set i 1} {$i < 255} {incr i} { + set rc [vfs_shmlock db255 main exclusive lock 4 1] + if {$rc != "SQLITE_BUSY"} { error $rc } + set rc [vfs_shmlock db$i main shared unlock 4 1] + if {$rc != "SQLITE_OK"} { error $rc } + } + + vfs_shmlock db255 main exclusive lock 4 1 + } {SQLITE_OK} + + vfs_shmlock db255 main exclusive unlock 4 1 + + for {set i 0} {$i < 256} {incr i} { + db$i close + } +} + +sqlite3 db0 test.db +sqlite3 db1 test.db +do_test 3.1 { execsql { SELECT * FROM t1 } db0 } {1 2} +do_test 3.2 { execsql { SELECT * FROM t1 } db1 } {1 2} +if {$tcl_platform(platform)=="windows"} { + set isWindows 1 +} else { + set isWindows 0 +} + +set L(0) {n n n n n n n n} +set L(1) {n n n n n n n n} +proc random_lock_test {idx} { + global L + set iSlot [expr int(rand()*8)] + if {[expr int(rand()*2)]} { + # Unlock operation + if {[lindex $L($idx) $iSlot]!="n"} { + vfs_shmlock db$idx main [lindex $L($idx) $iSlot] unlock $iSlot 1 + lset L($idx) $iSlot n + } + } else { + # Lock operation + if {[lindex $L($idx) $iSlot]=="n"} { + set locktype [lindex {e s} [expr int(rand()*2)]] + set n 1 + if {$locktype=="e"} { + for {set l $iSlot} {$l<8 && [lindex $L($idx) $l]=="n"} {incr l} {} + set n [expr int(rand()*($l-$iSlot))+1] + # The LockFile() and UnlockFile() apis on windows require that + # every unlock correspond exactly to a prior lock. Hence, we cannot + # lock arbitrary ranges in this test on windows. + if {$::isWindows} {set n 1} + # puts "iSlot=$iSlot l=$l L=$L($idx)" + # puts "$iSlot $n" + } + set res [vfs_shmlock db$idx main $locktype lock $iSlot $n] + + set bBusy 0 + for {set i $iSlot} {$i<($iSlot+$n)} {incr i} { + set other [lindex $L([expr ($idx+1)%2]) $i] + if {($other!="n" && $locktype=="e")||($other=="e" && $locktype=="s")} { + if {$res != "SQLITE_BUSY"} { error "BUSY not detected" } + set bBusy 1 + break + } + } + + if {$bBusy==0} { + if {$res != "SQLITE_OK"} { error "BUSY false-positive" } + for {set i $iSlot} {$i<($iSlot+$n)} {incr i} { + lset L($idx) $i $locktype + } + } + } + } +} + +set nStep 100000 +for {set i 0} {$i < $nStep} {incr i} { + random_lock_test 0 + random_lock_test 1 +} + +db0 close +db1 close + +finish_test diff --git a/test/snapshot_fault.test b/test/snapshot_fault.test index c0df4ec..2adb793 100644 --- a/test/snapshot_fault.test +++ b/test/snapshot_fault.test @@ -221,6 +221,31 @@ do_faultsim_test 4.1 -faults shm* -prep { faultsim_test_result {0 {}} {1 SQLITE_IOERR} } +#------------------------------------------------------------------------- +# Test the handling of faults that occur within sqlite3_snapshot_get(). +# +reset_db +do_execsql_test 5.0 { + PRAGMA page_size = 512; + PRAGMA journal_mode = wal; + PRAGMA wal_autocheckpoint = 0; + CREATE TABLE t1(zzz); + INSERT INTO t1 VALUES(randomblob( 5000 )); + PRAGMA user_version = 211; +} {wal 0} +faultsim_save_and_close + +do_faultsim_test 5 -prep { + faultsim_restore_and_reopen + execsql { SELECT count(*) FROM sqlite_master } + execsql BEGIN +} -body { + sqlite3_snapshot_get_blob db main + set {} {} +} -test { + execsql END + faultsim_test_result {0 {}} {1 SQLITE_IOERR} {1 SQLITE_NOMEM} +} finish_test diff --git a/test/tabfunc01.test b/test/tabfunc01.test index dfe3190..49f0df8 100644 --- a/test/tabfunc01.test +++ b/test/tabfunc01.test @@ -125,6 +125,11 @@ do_execsql_test tabfunc01-4.3 { SELECT * FROM aux1.generate_series(1,4) } {1 2 3 4} +# 2018-12-03: Fix bug reported by by private email. +do_execsql_test tabfunc01-4.4 { + SELECT * FROM (generate_series(1,5,2)) AS x LIMIT 10; +} {1 3 5} + # The next series of tests is verifying that virtual table are able # to optimize the IN operator, even on terms that are not marked "omit". # When the generate_series virtual table is compiled for the testfixture, diff --git a/test/tester.tcl b/test/tester.tcl index 14808d9..0a165a2 100644 --- a/test/tester.tcl +++ b/test/tester.tcl @@ -941,6 +941,12 @@ proc do_execsql_test {args} { set result "" } elseif {[llength $args]==3} { foreach {testname sql result} $args {} + + # With some versions of Tcl on windows, if $result is all whitespace but + # contains some CR/LF characters, the [list {*}$result] below returns a + # copy of $result instead of a zero length string. Not clear exactly why + # this is. The following is a workaround. + if {[llength $result]==0} { set result "" } } else { error [string trim { wrong # args: should be "do_execsql_test ?-db DB? testname sql ?result?" @@ -2048,9 +2054,11 @@ proc memdebug_log_sql {filename} { set tbl2 "CREATE TABLE ${database}.frame(frame INTEGER PRIMARY KEY, line);\n" set tbl3 "CREATE TABLE ${database}.file(name PRIMARY KEY, content);\n" + set pid [pid] + foreach f [array names frames] { set addr [format %x $f] - set cmd "addr2line -e [info nameofexec] $addr" + set cmd "eu-addr2line --pid=$pid $addr" set line [eval exec $cmd] append sql "INSERT INTO ${database}.frame VALUES($f, '$line');\n" diff --git a/test/triggerC.test b/test/triggerC.test index 3e47521..49d4eca 100644 --- a/test/triggerC.test +++ b/test/triggerC.test @@ -1042,4 +1042,20 @@ do_execsql_test 15.2.1 { do_execsql_test 15.2.2 { SELECT * FROM x2; } {1 2 3 4} do_execsql_test 15.2.3 { SELECT * FROM """x2"""; } {3 11 x y} +#------------------------------------------------------------------------- +# At one point queries such as the following were causing segfaults. +# +do_catchsql_test 16.1 { + SELECT raise(ABORT, 'msg') FROM sqlite_master + UNION SELECT 1 + ORDER BY raise(IGNORE); +} {1 {1st ORDER BY term does not match any column in the result set}} + +do_catchsql_test 16.2 { + SELECT count(*) FROM sqlite_master + GROUP BY raise(IGNORE) + HAVING raise(ABORT, 'msg'); +} {1 {RAISE() may only be used within a trigger-program}} + finish_test + diff --git a/test/triggerF.test b/test/triggerF.test index e0c3b52..2e3e35e 100644 --- a/test/triggerF.test +++ b/test/triggerF.test @@ -20,7 +20,7 @@ ifcapable {!trigger} { foreach {tn sql log} { - 1 { } { } + 1 {} {} 2 { CREATE TRIGGER trd AFTER DELETE ON t1 BEGIN diff --git a/test/unionvtab.test b/test/unionvtab.test index 5725869..ac5ecb7 100644 --- a/test/unionvtab.test +++ b/test/unionvtab.test @@ -373,7 +373,7 @@ do_execsql_test 4.3.3 { } do_execsql_test 4.3.4 { SELECT * FROM sl WHERE rowid<-9223372036854775808 -} { } +} {} do_execsql_test 4.4.1 { SELECT * FROM sl WHERE rowid<9223372036854775807 @@ -394,7 +394,7 @@ do_execsql_test 4.4.3 { } do_execsql_test 4.4.4 { SELECT * FROM sl WHERE rowid>9223372036854775807 -} { } +} {} #------------------------------------------------------------------------- # More than 8 source tables. diff --git a/test/update2.test b/test/update2.test index a6c3113..41a7224 100644 --- a/test/update2.test +++ b/test/update2.test @@ -216,4 +216,20 @@ do_execsql_test 6.2 { SELECT * FROM d1; } {3 2} +# 2019-01-22 Bug in UPDATE OR REPLACE discovered by the +# Matt Denton's LPM fuzzer +# +do_execsql_test 7.100 { + DROP TABLE IF EXISTS t1; + CREATE TABLE t1(x,y); + CREATE UNIQUE INDEX t1x1 ON t1(x) WHERE x IS NOT NULL; + INSERT INTO t1(x) VALUES(NULL),(NULL); + CREATE INDEX t1x2 ON t1(y); + SELECT quote(x), quote(y), '|' FROM t1; +} {NULL NULL | NULL NULL |} +do_execsql_test 7.110 { + UPDATE OR REPLACE t1 SET x=1; + SELECT quote(x), quote(y), '|' FROM t1; +} {1 NULL |} + finish_test diff --git a/test/vacuum-into.test b/test/vacuum-into.test new file mode 100644 index 0000000..761db1f --- /dev/null +++ b/test/vacuum-into.test @@ -0,0 +1,90 @@ +# 2018-12-07 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. The +# focus of this file is testing the VACUUM INTO statement. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +# If the VACUUM statement is disabled in the current build, skip all +# the tests in this file. +# +ifcapable {!vacuum} { + omit_test vacuum.test {Compiled with SQLITE_OMIT_VACUUM} + finish_test + return +} + +forcedelete out.db +do_execsql_test vacuum-into-100 { + CREATE TABLE t1(a INTEGER PRIMARY KEY, b); + WITH RECURSIVE c(x) AS (VALUES(1) UNION ALL SELECT x+1 FROM c WHERE x<100) + INSERT INTO t1(a,b) SELECT x, randomblob(600) FROM c; + CREATE INDEX t1b ON t1(b); + DELETE FROM t1 WHERE a%2; + SELECT count(*), sum(a), sum(length(b)) FROM t1; +} {50 2550 30000} +do_execsql_test vacuum-into-110 { + VACUUM main INTO 'out.db'; +} {} +sqlite3 db2 out.db +do_test vacuum-into-120 { + db2 eval {SELECT count(*), sum(a), sum(length(b)) FROM t1} +} {50 2550 30000} +do_catchsql_test vacuum-into-130 { + VACUUM INTO 'out.db'; +} {1 {output file already exists}} +forcedelete out2.db +do_catchsql_test vacuum-into-140 { + VACUUM INTO 'out2.db'; +} {0 {}} +do_catchsql_test vacuum-into-150 { + VACUUM INTO 'out2.db'; +} {1 {output file already exists}} + +do_catchsql_test vacuum-into-200 { + VACUUM main INTO ':memory:'; +} {0 {}} + +# The INTO argument can be an arbitrary expression. +# +do_execsql_test vacuum-into-300 { + CREATE TABLE t2(name TEXT); + INSERT INTO t2 VALUES(':memory:'); + VACUUM main INTO (SELECT name FROM t2); +} {} +do_catchsql_test vacuum-into-310 { + VACUUM INTO null; +} {1 {non-text filename}} +do_catchsql_test vacuum-into-320 { + VACUUM INTO x; +} {1 {no such column: x}} +do_catchsql_test vacuum-into-330 { + VACUUM INTO t1.nosuchcol; +} {1 {no such column: t1.nosuchcol}} +do_catchsql_test vacuum-into-340 { + VACUUM INTO main.t1.nosuchcol; +} {1 {no such column: main.t1.nosuchcol}} + +forcedelete test.db2 +db func target target +proc target {} { return "test.db2" } +do_test vacuum-into-410 { + execsql { VACUUM INTO target() } + file exists test.db2 +} 1 +do_catchsql_test vacuum-into-420 { + VACUUM INTO target2() +} {1 {no such function: target2}} + + +finish_test diff --git a/test/vtabdrop.test b/test/vtabdrop.test new file mode 100644 index 0000000..1f9309e --- /dev/null +++ b/test/vtabdrop.test @@ -0,0 +1,127 @@ +# 2018 December 28 +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# +# The tests in this file test edge cases surrounding DROP TABLE on +# virtual tables. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl + +ifcapable !vtab { finish_test ; return } +source $testdir/fts3_common.tcl +source $testdir/malloc_common.tcl + +set testprefix vtabdrop + +#------------------------------------------------------------------------- +# Test that if a DROP TABLE is executed against an rtree table, but the +# xDestroy() call fails, the rtree table is not dropped, the sqlite_master +# table is not modified and the internal schema remains intact. +# +ifcapable rtree { + do_execsql_test 1.0 { + CREATE VIRTUAL TABLE rt USING rtree(id, x1, x2); + CREATE TABLE t1(x, y); + INSERT INTO t1 VALUES(1, 2); + } + + do_test 1.1 { + execsql { + BEGIN; + INSERT INTO t1 VALUES(3, 4); + } + db eval { SELECT * FROM t1 } { + catchsql { DROP TABLE rt } + } + execsql COMMIT + } {} + + do_execsql_test 1.2 { + SELECT name FROM sqlite_master ORDER BY 1; + SELECT * FROM t1; + SELECT * FROM rt; + } {rt rt_node rt_parent rt_rowid t1 1 2 3 4} + + db close + sqlite3 db test.db + + do_execsql_test 1.3 { + SELECT name FROM sqlite_master ORDER BY 1; + } {rt rt_node rt_parent rt_rowid t1} +} + +#------------------------------------------------------------------------- +# Same as tests 1.*, except with fts5 instead of rtree. +# +ifcapable fts5 { + reset_db + do_execsql_test 2.0 { + CREATE VIRTUAL TABLE ft USING fts5(x); + CREATE TABLE t1(x, y); + INSERT INTO t1 VALUES(1, 2); + } + + do_test 2.1 { + execsql { + BEGIN; + INSERT INTO t1 VALUES(3, 4); + } + db eval { SELECT * FROM t1 } { + catchsql { DROP TABLE ft } + } + execsql COMMIT + } {} + + do_execsql_test 2.2 { + SELECT name FROM sqlite_master ORDER BY 1; + } {ft ft_config ft_content ft_data ft_docsize ft_idx t1} + + db close + sqlite3 db test.db + + do_execsql_test 2.3 { + SELECT name FROM sqlite_master ORDER BY 1; + } {ft ft_config ft_content ft_data ft_docsize ft_idx t1} +} + +#------------------------------------------------------------------------- +# Same as tests 1.*, except with fts3 instead of rtree. +# +ifcapable fts3 { + reset_db + do_execsql_test 2.0 { + CREATE VIRTUAL TABLE ft USING fts3(x); + CREATE TABLE t1(x, y); + INSERT INTO t1 VALUES(1, 2); + } + + do_test 2.1 { + execsql { + BEGIN; + INSERT INTO t1 VALUES(3, 4); + } + db eval { SELECT * FROM t1 } { + catchsql { DROP TABLE ft } + } + execsql COMMIT + } {} + + do_execsql_test 2.2 { + SELECT name FROM sqlite_master ORDER BY 1; + } {ft ft_content ft_segdir ft_segments sqlite_autoindex_ft_segdir_1 t1} + + db close + sqlite3 db test.db + + do_execsql_test 2.3 { + SELECT name FROM sqlite_master ORDER BY 1; + } {ft ft_content ft_segdir ft_segments sqlite_autoindex_ft_segdir_1 t1} +} + +finish_test diff --git a/test/wal.test b/test/wal.test index bb164bb..a003b6a 100644 --- a/test/wal.test +++ b/test/wal.test @@ -1297,51 +1297,53 @@ do_test wal-19.4 { # At one point, SQLite was failing to grow the mapping of the wal-index # file in step 3 and the checkpoint was corrupting the database file. # -do_test wal-20.1 { - catch {db close} - forcedelete test.db test.db-wal test.db-journal - sqlite3 db test.db - execsql { - PRAGMA journal_mode = WAL; - CREATE TABLE t1(x); - INSERT INTO t1 VALUES(randomblob(900)); - SELECT count(*) FROM t1; - } -} {wal 1} -do_test wal-20.2 { - set ::buddy [launch_testfixture] - testfixture $::buddy { +if {[permutation]!="unix-excl"} { + do_test wal-20.1 { + catch {db close} + forcedelete test.db test.db-wal test.db-journal sqlite3 db test.db - db transaction { db eval { - PRAGMA wal_autocheckpoint = 0; - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 2 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 4 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 8 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 16 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 32 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 64 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 128 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 256 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 512 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 1024 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 2048 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 4096 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 8192 */ - INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 16384 */ - } } - } -} {0} -do_test wal-20.3 { - close $::buddy - execsql { PRAGMA wal_checkpoint } - execsql { SELECT count(*) FROM t1 } -} {16384} -do_test wal-20.4 { - db close - sqlite3 db test.db - execsql { SELECT count(*) FROM t1 } -} {16384} -integrity_check wal-20.5 + execsql { + PRAGMA journal_mode = WAL; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES(randomblob(900)); + SELECT count(*) FROM t1; + } + } {wal 1} + do_test wal-20.2 { + set ::buddy [launch_testfixture] + testfixture $::buddy { + sqlite3 db test.db + db transaction { db eval { + PRAGMA wal_autocheckpoint = 0; + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 2 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 4 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 8 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 16 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 32 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 64 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 128 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 256 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 512 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 1024 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 2048 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 4096 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 8192 */ + INSERT INTO t1 SELECT randomblob(900) FROM t1; /* 16384 */ + } } + } + } {0} + do_test wal-20.3 { + close $::buddy + execsql { PRAGMA wal_checkpoint } + execsql { SELECT count(*) FROM t1 } + } {16384} + do_test wal-20.4 { + db close + sqlite3 db test.db + execsql { SELECT count(*) FROM t1 } + } {16384} + integrity_check wal-20.5 +} catch { db2 close } catch { db close } diff --git a/test/walfault2.test b/test/walfault2.test new file mode 100644 index 0000000..a4c352b --- /dev/null +++ b/test/walfault2.test @@ -0,0 +1,91 @@ +# 2010 May 03 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. The +# focus of this file is testing the operation of the library in +# "PRAGMA journal_mode=WAL" mode. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/malloc_common.tcl +source $testdir/lock_common.tcl + +ifcapable !wal {finish_test ; return } +set testprefix walfault2 + +#------------------------------------------------------------------------- +# Inject faults while truncating the wal file. +# +do_execsql_test 1.0 { + PRAGMA auto_vacuum = 0; + CREATE TABLE t1(a, b); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 30 + ) + INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; +} {wal} +faultsim_save_and_close + +do_faultsim_test 1 -prep { + catch { db close } + faultsim_restore + sqlite3 db file:test.db?psow=0 -uri 1 + file_control_powersafe_overwrite db 0 + execsql { + PRAGMA wal_checkpoint; + PRAGMA journal_size_limit = 10000; + PRAGMA synchronous = full; + } +} -body { + execsql { INSERT INTO t1 VALUES(1,1) } +} -test { + faultsim_test_result {0 {}} +} + +#------------------------------------------------------------------------- +# Inject faults while rewriting checksums. +# +reset_db +do_execsql_test 2.0 { + PRAGMA auto_vacuum = 0; + CREATE TABLE t1(a, b); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 30 + ) + INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; +} {wal} +faultsim_save_and_close + +do_faultsim_test 2 -prep { + faultsim_restore_and_reopen + execsql { + PRAGMA cache_size = 2; + BEGIN; + UPDATE t1 SET a=randomblob(400); + UPDATE t1 SET b=randomblob(400); + UPDATE t1 SET a=randomblob(400); + UPDATE t1 SET b=randomblob(400); + UPDATE t1 SET a=randomblob(400); + UPDATE t1 SET b=randomblob(400); + UPDATE t1 SET a=randomblob(400); + UPDATE t1 SET b=randomblob(400); + } +} -body { + execsql COMMIT +} -test { + faultsim_test_result {0 {}} +} + + + +finish_test diff --git a/test/walvfs.test b/test/walvfs.test new file mode 100644 index 0000000..cb8005c --- /dev/null +++ b/test/walvfs.test @@ -0,0 +1,429 @@ +# 2018 December 23 +# +# The author disclaims copyright to this source code. In place of +# a legal notice, here is a blessing: +# +# May you do good and not evil. +# May you find forgiveness for yourself and forgive others. +# May you share freely, never taking more than you give. +# +#*********************************************************************** +# This file implements regression tests for SQLite library. The +# focus of this file is testing the operation of the library in +# "PRAGMA journal_mode=WAL" mode. +# + +set testdir [file dirname $argv0] +source $testdir/tester.tcl +source $testdir/lock_common.tcl +source $testdir/malloc_common.tcl +source $testdir/wal_common.tcl +set testprefix walvfs + +ifcapable !wal {finish_test ; return } + +db close +testvfs tvfs +tvfs script xSync +tvfs filter xSync +set ::sync_count 0 +proc xSync {method file args} { + if {[file tail $file]=="test.db-wal"} { + incr ::sync_count + } +} + + +#------------------------------------------------------------------------- +# Test that if IOCAP_SEQUENTIAL is set, the wal-header is not synced to +# disk immediately after it is written. +# +sqlite3 db test.db -vfs tvfs +do_execsql_test 1.0 { + PRAGMA auto_vacuum = 0; + PRAGMA journal_mode = wal; + PRAGMA synchronous = normal; + CREATE TABLE t1(a, b, c); + INSERT INTO t1 VALUES(1, 2, 3); + INSERT INTO t1 VALUES(4, 5, 6); + INSERT INTO t1 VALUES(7, 8, 9); + PRAGMA wal_checkpoint; +} {wal 0 5 5} + +set ::sync_count 0 +do_test 1.1 { + execsql { INSERT INTO t1 VALUES(10, 11, 12) } + set ::sync_count +} 1 + +db close +tvfs devchar sequential +sqlite3 db test.db -vfs tvfs +do_execsql_test 1.2 { + PRAGMA synchronous = normal; + INSERT INTO t1 VALUES(13, 14, 15); + INSERT INTO t1 VALUES(16, 17, 18); + PRAGMA wal_checkpoint; +} {0 4 4} + +set ::sync_count 0 +do_test 1.3 { + execsql { INSERT INTO t1 VALUES(10, 11, 12) } + set ::sync_count +} 0 + +#------------------------------------------------------------------------- +# Test that "PRAGMA journal_size_limit" works in wal mode. +# +reset_db +do_execsql_test 2.0 { + PRAGMA journal_size_limit = 10000; + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 + ) + INSERT INTO t1 SELECT randomblob(750) FROM s; +} {10000 wal} +do_test 2.1 { + expr [file size test.db-wal]>12000 +} {1} +do_test 2.2 { + execsql { + PRAGMA wal_checkpoint; + INSERT INTO t1 VALUES(randomblob(750)); + } + file size test.db-wal +} {10000} +do_test 2.3 { + execsql { + PRAGMA journal_size_limit = 8000; + PRAGMA wal_checkpoint; + INSERT INTO t1 VALUES(randomblob(750)); + } + file size test.db-wal +} {8000} + +#------------------------------------------------------------------------- +# Test that a checkpoint may be interrupted using sqlite3_interrupt(). +# And that the error code is SQLITE_NOMEM, not SQLITE_INTERRUPT, if +# an OOM error occurs just before the sqlite3_interrupt() call. +# +reset_db +db close +sqlite3 db test.db -vfs tvfs +tvfs filter {} + +do_execsql_test 3.0 { + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 + ) + INSERT INTO t1 SELECT randomblob(750) FROM s; +} {wal} + +tvfs filter xWrite +tvfs script xWrite +set ::cnt 2 +proc xWrite {method file args} { + if {[file tail $file]=="test.db"} { + incr ::cnt -1 + if {$::cnt==0} { + sqlite3_interrupt db + } + } + return SQLITE_OK +} + +do_catchsql_test 3.1 { + PRAGMA wal_checkpoint +} {1 interrupted} + +set ::cnt 2 +proc xWrite {method file args} { + if {[file tail $file]=="test.db"} { + incr ::cnt -1 + if {$::cnt==0} { + sqlite3_memdebug_fail 5 -repeat 0 + catchsql { SELECT 'a big long string!' } + sqlite3_interrupt db + } + } + return SQLITE_OK +} + +do_catchsql_test 3.2 { + PRAGMA wal_checkpoint +} {1 {out of memory}} + +#------------------------------------------------------------------------- +# +reset_db +db close +do_test 4.0 { + sqlite3 db test.db -vfs tvfs + execsql { + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 + ) + INSERT INTO t1 SELECT randomblob(750) FROM s; + } db +} {wal} +db close + +tvfs filter xShmMap +tvfs script xShmMap +proc xShmMap {method file args} { + return SQLITE_READONLY +} +sqlite3 db test.db -vfs tvfs +do_catchsql_test 4.1 { + SELECT count(*) FROM t1 +} {1 {attempt to write a readonly database}} + +set ::cnt 5 +tvfs filter {xShmMap xShmLock} +proc xShmMap {method file name args} { + switch -- $method { + xShmMap { return SQLITE_READONLY } + xShmLock { + if {$args == "{0 1 lock shared}"} { + incr ::cnt -1 + if {$::cnt>0} { return SQLITE_BUSY } + } + } + } + return SQLITE_OK +} +do_catchsql_test 4.2 { + SELECT count(*) FROM t1 +} {1 {attempt to write a readonly database}} + +#------------------------------------------------------------------------- +# +reset_db +db close +sqlite3 db test.db -vfs tvfs +tvfs filter {} +do_execsql_test 5.0 { + PRAGMA auto_vacuum = 0; + PRAGMA page_size = 1024; + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 + ) + INSERT INTO t1 SELECT randomblob(750) FROM s; +} {wal} + +do_execsql_test 5.1 { + SELECT count(*) FROM t1 +} {20} + +do_test 5.2 { + vfs_set_readmark db main 1 100 + vfs_set_readmark db main 2 100 + vfs_set_readmark db main 3 100 + vfs_set_readmark db main 4 100 +} {100} + +do_execsql_test 5.3 { + SELECT count(*) FROM t1 +} {20} + +do_test 5.3 { + list [vfs_set_readmark db main 1] \ + [vfs_set_readmark db main 2] \ + [vfs_set_readmark db main 3] \ + [vfs_set_readmark db main 4] +} {24 100 100 100} + +tvfs script xShmLock +tvfs filter xShmLock +set ::cnt 20 +proc xShmLock {args} { + incr ::cnt -1 + if {$::cnt>0} { return SQLITE_BUSY } + return SQLITE_OK +} + +do_test 5.4 { + vfs_set_readmark db main 1 100 + execsql { SELECT count(*) FROM t1 } +} {20} + +vfs_set_readmark db main 1 100 +vfs_set_readmark db main 2 100 +vfs_set_readmark db main 3 100 +vfs_set_readmark db main 4 100 + +tvfs script xShmMapLock +tvfs filter {xShmLock xShmMap} +proc xShmMapLock {method args} { + if {$method=="xShmMap"} { + return "SQLITE_READONLY" + } + return SQLITE_BUSY +} + +sqlite3 db2 test.db -vfs tvfs +breakpoint +do_test 5.5 { + list [catch { execsql { SELECT count(*) FROM t1 } db2 } msg] $msg +} {1 {attempt to write a readonly database}} + +tvfs filter {} +vfs_set_readmark db main 1 1 + +do_test 5.6 { + list [catch { execsql { SELECT count(*) FROM t1 } db2 } msg] $msg +} {0 20} +db2 close +db close + +#------------------------------------------------------------------------- +# Cause an SQLITE_PROTOCOL while attempting to restart the wal file. +# +reset_db +tvfs filter {} +db close +sqlite3 db test.db -vfs tvfs +do_execsql_test 6.0 { + PRAGMA auto_vacuum = 0; + PRAGMA page_size = 1024; + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 + ) + INSERT INTO t1 SELECT randomblob(750) FROM s; +} {wal} + +do_test 6.1 { + execsql { PRAGMA wal_checkpoint } + set {} {} +} {} + +tvfs filter xShmLock +tvfs script xShmLock +set ::flag 0 +proc xShmLock {method file handle spec} { + if {$::flag && [lrange $spec 2 end]=="lock shared"} { + return SQLITE_BUSY + } + if {$spec=="3 1 unlock shared"} { + set ::flag 1 + } + return SQLITE_OK +} + +puts "# WARNING: This next test takes around 12 seconds" +do_catchsql_test 6.2 { + INSERT INTO t1 VALUES(1); +} {1 {locking protocol}} + +#------------------------------------------------------------------------- +# Check that a checkpoint fails if it cannot get the CHECKPOINTER lock +# +reset_db +tvfs filter {} +db close +sqlite3 db test.db -vfs tvfs +do_execsql_test 7.0 { + PRAGMA auto_vacuum = 0; + PRAGMA page_size = 1024; + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( + SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 + ) + INSERT INTO t1 SELECT randomblob(750) FROM s; +} {wal} + +tvfs script xShmLock +tvfs filter xShmLock +proc xShmLock {method file handle spec} { + if {$spec=="1 1 lock exclusive"} { + return SQLITE_BUSY + } + return SQLITE_OK +} + +do_execsql_test 7.1 { + PRAGMA wal_checkpoint +} {1 -1 -1} + +#------------------------------------------------------------------------- +# Check that the page cache is correctly flushed if a checkpointer using +# a version 2 VFS makes a checkpoint with an out-of-date cache. +# +reset_db +testvfs tvfs2 -iversion 2 +db close +sqlite3 db test.db -vfs tvfs2 +do_execsql_test 8.0 { + PRAGMA auto_vacuum = 0; + PRAGMA page_size = 1024; + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 ) + INSERT INTO t1 SELECT randomblob(75) FROM s; +} {wal} + +do_execsql_test 8.1 { SELECT count(*) FROM t1 } {20} + +do_test 8.2 { + sqlite3 db2 test.db -vfs tvfs2 + execsql { + INSERT INTO t1 VALUES(randomblob(75)); + } db2 + db2 close +} {} + +do_execsql_test 8.3 { + PRAGMA wal_checkpoint; + SELECT count(*) FROM t1 +} {0 5 5 21} +tvfs2 delete + +#------------------------------------------------------------------------- +reset_db +db close +sqlite3 db test.db -vfs tvfs +do_execsql_test 9.0 { + PRAGMA auto_vacuum = 0; + PRAGMA page_size = 1024; + CREATE TABLE t1(x); + PRAGMA journal_mode = wal; + WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s LIMIT 20 ) + INSERT INTO t1 SELECT randomblob(75) FROM s; +} {wal} + +sqlite3 db2 test.db -vfs tvfs +tvfs filter {xShmMap xShmLock} +tvfs script xShmMap +proc xShmMap {method file handle args} { + switch -- $method { + xShmMap { + return "SQLITE_READONLY_CANTINIT" + } + xShmLock { + if {$args=="{3 1 lock shared}"} { + return "SQLITE_IOERR" + } + } + } +} + +do_test 9.1 { + catchsql { SELECT count(*) FROM t1 } db2 +} {1 {disk I/O error}} + +db close +db2 close +tvfs delete +finish_test + diff --git a/test/where7.test b/test/where7.test index 5abd0a8..81111a9 100644 --- a/test/where7.test +++ b/test/where7.test @@ -23353,8 +23353,10 @@ do_eqp_test where7-3.2 { } { QUERY PLAN |--MULTI-INDEX OR - | |--SEARCH TABLE t301 USING COVERING INDEX t301_c4 (c4=?) - | `--SEARCH TABLE t301 USING INTEGER PRIMARY KEY (rowid=?) + | |--INDEX 1 + | | `--SEARCH TABLE t301 USING COVERING INDEX t301_c4 (c4=?) + | `--INDEX 2 + | `--SEARCH TABLE t301 USING INTEGER PRIMARY KEY (rowid=?) |--SEARCH TABLE t302 USING INDEX t302_c8_c3 (c8=? AND c3>?) `--USE TEMP B-TREE FOR ORDER BY } diff --git a/test/where9.test b/test/where9.test index 87f5c15..7a019d3 100644 --- a/test/where9.test +++ b/test/where9.test @@ -364,8 +364,10 @@ ifcapable explain { QUERY PLAN |--SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?) `--MULTI-INDEX OR - |--SEARCH TABLE t2 USING INDEX t2d (d=?) - `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) + |--INDEX 1 + | `--SEARCH TABLE t2 USING INDEX t2d (d=?) + `--INDEX 3 + `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) }] do_eqp_test where9-3.2 { SELECT coalesce(t2.a,9999) @@ -375,8 +377,10 @@ ifcapable explain { QUERY PLAN |--SEARCH TABLE t1 USING INTEGER PRIMARY KEY (rowid=?) `--MULTI-INDEX OR - |--SEARCH TABLE t2 USING INDEX t2d (d=?) - `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) + |--INDEX 1 + | `--SEARCH TABLE t2 USING INDEX t2d (d=?) + `--INDEX 2 + `--SEARCH TABLE t2 USING COVERING INDEX t2f (f=?) }] } @@ -456,8 +460,10 @@ do_eqp_test where9-5.1 { } { QUERY PLAN `--MULTI-INDEX OR - |--SEARCH TABLE t1 USING INDEX t1c (c=?) - `--SEARCH TABLE t1 USING INDEX t1d (d=?) + |--INDEX 1 + | `--SEARCH TABLE t1 USING INDEX t1c (c=?) + `--INDEX 2 + `--SEARCH TABLE t1 USING INDEX t1d (d=?) } # In contrast, b=1000 is preferred over any OR-clause. diff --git a/test/whereI.test b/test/whereI.test index d08e62c..7bb4ba3 100644 --- a/test/whereI.test +++ b/test/whereI.test @@ -31,8 +31,10 @@ do_eqp_test 1.1 { } { QUERY PLAN `--MULTI-INDEX OR - |--SEARCH TABLE t1 USING INDEX i1 (b=?) - `--SEARCH TABLE t1 USING INDEX i2 (c=?) + |--INDEX 1 + | `--SEARCH TABLE t1 USING INDEX i1 (b=?) + `--INDEX 2 + `--SEARCH TABLE t1 USING INDEX i2 (c=?) } do_execsql_test 1.2 { @@ -61,8 +63,10 @@ do_eqp_test 2.1 { } { QUERY PLAN `--MULTI-INDEX OR - |--SEARCH TABLE t2 USING INDEX i3 (b=?) - `--SEARCH TABLE t2 USING INDEX i4 (c=?) + |--INDEX 1 + | `--SEARCH TABLE t2 USING INDEX i3 (b=?) + `--INDEX 2 + `--SEARCH TABLE t2 USING INDEX i4 (c=?) } do_execsql_test 2.2 { diff --git a/test/window1.test b/test/window1.test index a8399a8..2c50420 100644 --- a/test/window1.test +++ b/test/window1.test @@ -591,7 +591,114 @@ do_execsql_test 13.5 { SELECT a, rank() OVER(ORDER BY b) FROM t1 INTERSECT SELECT a, rank() OVER(ORDER BY b DESC) FROM t1; -} { +} {} + +# 2018-12-06 +# https://www.sqlite.org/src/info/f09fcd17810f65f7 +# Assertion fault when window functions are used. +# +# Root cause is the query flattener invoking sqlite3ExprDup() on +# expressions that contain subqueries with window functions. The +# sqlite3ExprDup() routine is not making correctly initializing +# Select.pWin field of the subqueries. +# +sqlite3 db :memory: +do_execsql_test 14.0 { + SELECT * FROM( + SELECT * FROM (SELECT 1 AS c) WHERE c IN ( + SELECT (row_number() OVER()) FROM (VALUES (0)) + ) + ); +} {1} +do_execsql_test 14.1 { + CREATE TABLE t1(x); INSERT INTO t1(x) VALUES(12345); + CREATE TABLE t2(c); INSERT INTO t2(c) VALUES(1); + SELECT y, y+1, y+2 FROM ( + SELECT c IN ( + SELECT (row_number() OVER()) FROM t1 + ) AS y FROM t2 + ); +} {1 2 3} + +# 2018-12-31 +# https://www.sqlite.org/src/info/d0866b26f83e9c55 +# Window function in correlated subquery causes assertion fault +# +do_catchsql_test 15.0 { + WITH t(id, parent) AS ( + SELECT CAST(1 AS INT), CAST(NULL AS INT) + UNION ALL + SELECT 2, NULL + UNION ALL + SELECT 3, 1 + UNION ALL + SELECT 4, 1 + UNION ALL + SELECT 5, 2 + UNION ALL + SELECT 6, 2 + ), q AS ( + SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) AS rn + FROM t + WHERE parent IS NULL + UNION ALL + SELECT t.*, ROW_NUMBER() OVER (ORDER BY t.id) AS rn + FROM q + JOIN t + ON t.parent = q.id + ) + SELECT * + FROM q; +} {1 {cannot use window functions in recursive queries}} +do_execsql_test 15.1 { + DROP TABLE IF EXISTS t1; + DROP TABLE IF EXISTS t2; + CREATE TABLE t1(x); + INSERT INTO t1 VALUES('a'), ('b'), ('c'); + CREATE TABLE t2(a, b); + INSERT INTO t2 VALUES('X', 1), ('X', 2), ('Y', 2), ('Y', 3); + SELECT x, ( + SELECT sum(b) + OVER (PARTITION BY a ROWS BETWEEN UNBOUNDED PRECEDING + AND UNBOUNDED FOLLOWING) + FROM t2 WHERE b +#include +#include +#include + +/* Return true if the line is all zeros */ +static int allZero(unsigned char *aLine){ + int i; + for(i=0; i<16 && aLine[i]==0; i++){} + return i==16; +} + +int main(int argc, char **argv){ + int pgsz = 0; /* page size */ + long szFile; /* Size of the input file in bytes */ + FILE *in; /* Input file */ + int i, j; /* Loop counters */ + int nErr = 0; /* Number of errors */ + const char *zInputFile = 0; /* Name of the input file */ + const char *zBaseName = 0; /* Base name of the file */ + int lastPage = 0; /* Last page number shown */ + int iPage; /* Current page number */ + unsigned char aLine[16]; /* A single line of the file */ + unsigned char aHdr[100]; /* File header */ + unsigned char bShow[256]; /* Characters ok to display */ + memset(bShow, '.', sizeof(bShow)); + for(i=' '; i<='~'; i++){ + if( i!='{' && i!='}' && i!='"' && i!='\\' ) bShow[i] = i; + } + for(i=1; i65536 || (pgsz&(pgsz-1))!=0 ){ + fprintf(stderr, "Page size must be a power of two between" + " 512 and 65536.\n"); + nErr++; + } + continue; + } + fprintf(stderr, "Unknown option: %s\n", argv[i]); + nErr++; + }else if( zInputFile ){ + fprintf(stderr, "Already using a different input file: [%s]\n", argv[i]); + nErr++; + }else{ + zInputFile = argv[i]; + } + } + if( zInputFile==0 ){ + fprintf(stderr, "No input file specified.\n"); + nErr++; + } + if( nErr ){ + fprintf(stderr, "Usage: %s [--pagesize N] FILENAME\n", argv[0]); + exit(1); + } + in = fopen(zInputFile, "rb"); + if( in==0 ){ + fprintf(stderr, "Cannot open input file [%s]\n", zInputFile); + exit(1); + } + fseek(in, 0, SEEK_END); + szFile = ftell(in); + rewind(in); + if( szFile<100 ){ + fprintf(stderr, "File too short. Minimum size is 100 bytes.\n"); + exit(1); + } + if( fread(aHdr, 100, 1, in)!=1 ){ + fprintf(stderr, "Cannot read file header\n"); + exit(1); + } + rewind(in); + if( pgsz==0 ){ + pgsz = (aHdr[16]<<8) | aHdr[17]; + if( pgsz==1 ) pgsz = 65536; + if( pgsz<512 || (pgsz&(pgsz-1))!=0 ){ + fprintf(stderr, "Invalid page size in header: %d\n", pgsz); + exit(1); + } + } + zBaseName = zInputFile; + for(i=0; zInputFile[i]; i++){ + if( zInputFile[i]=='/' && zInputFile[i+1]!=0 ) zBaseName = zInputFile+i+1; + } + printf("| size %d pagesize %d filename %s\n",(int)szFile,pgsz,zBaseName); + for(i=0; iThe dbtotxt Tool

    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­l5~g%`-VRh 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 KyGxvc>3;wPO0R*m)H5SiBMq(A%r2TnzAxv@ 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