@@ -1,8 +1,8 @@
1 1 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/******************************************************************************
2 2 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This file is an amalgamation of many separate C source files from SQLite
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** version 3.7.7. By combining all the individual C code files into this
3 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** version 3.7.8. By combining all the individual C code files into this
4 4 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** single large file, the entire code can be compiled as a single translation
5 5 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** unit. This allows many compilers to do optimizations that would not be
6 6 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** possible if the files were compiled separately. Performance improvements
7 7 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of 5% or more are commonly seen when SQLite is compiled as a single
8 8 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** translation unit.
@@ -648,13 +648,13 @@
648 648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
649 649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** See also: [sqlite3_libversion()],
650 650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [sqlite3_libversion_number()], [sqlite3_sourceid()],
651 651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [sqlite_version()] and [sqlite_source_id()].
652 652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_VERSION "3.7.7"
654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_VERSION_NUMBER 3007007
655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_SOURCE_ID "2011-06-03 14:19:10 0206bc6f87bb9393218a380fc5b18039d334a8d8"
653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_VERSION "3.7.8"
654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_VERSION_NUMBER 3007008
655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_SOURCE_ID "2011-08-16 02:07:04 9650d7962804d61f56cac944ff9bb2c7bc111957"
656 656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
657 657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
658 658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Run-Time Library Version Numbers
659 659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** KEYWORDS: sqlite3_version, sqlite3_sourceid
660 660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -851,11 +851,11 @@
851 851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** semicolon-separate SQL statements passed into its 2nd argument,
852 852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** in the context of the [database connection] passed in as its 1st
853 853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** argument. ^If the callback function of the 3rd argument to
854 854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3_exec() is not NULL, then it is invoked for each result row
855 855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** coming out of the evaluated SQL statements. ^The 4th argument to
856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** to sqlite3_exec() is relayed through to the 1st argument of each
856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3_exec() is relayed through to the 1st argument of each
857 857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** callback invocation. ^If the callback pointer to sqlite3_exec()
858 858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is NULL, then no callback is ever invoked and result rows are
859 859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ignored.
860 860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
861 861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^If an error occurs while evaluating the SQL statements passed into
@@ -1282,20 +1282,52 @@
1282 1282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** when [PRAGMA synchronous | PRAGMA synchronous=OFF] is set, but most
1283 1283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** VFSes do not need this signal and should silently ignore this opcode.
1284 1284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Applications should not call [sqlite3_file_control()] with this
1285 1285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** opcode as doing so may disrupt the operation of the specialized VFSes
1286 1286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** that do require it.
1287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^The [SQLITE_FCNTL_WIN32_AV_RETRY] opcode is used to configure automatic
1289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** retry counts and intervals for certain disk I/O operations for the
1290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** windows [VFS] in order to work to provide robustness against
1291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** anti-virus programs. By default, the windows VFS will retry file read,
1292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** file write, and file delete opertions up to 10 times, with a delay
1293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of 25 milliseconds before the first retry and with the delay increasing
1294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by an additional 25 milliseconds with each subsequent retry. This
1295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** opcode allows those to values (10 retries and 25 milliseconds of delay)
1296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to be adjusted. The values are changed for all database connections
1297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** within the same process. The argument is a pointer to an array of two
1298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** integers where the first integer i the new retry count and the second
1299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** integer is the delay. If either integer is negative, then the setting
1300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is not changed but instead the prior value of that setting is written
1301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** into the array entry, allowing the current retry settings to be
1302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** interrogated. The zDbName parameter is ignored.
1303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^The [SQLITE_FCNTL_PERSIST_WAL] opcode is used to set or query the
1305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** persistent [WAL | Write AHead Log] setting. By default, the auxiliary
1306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** write ahead log and shared memory files used for transaction control
1307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are automatically deleted when the latest connection to the database
1308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** closes. Setting persistent WAL mode causes those files to persist after
1309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** close. Persisting the files is useful when other processes that do not
1310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** have write permission on the directory containing the database file want
1311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to read the database file, as the WAL and shared memory files must exist
1312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in order for the database to be readable. The fourth parameter to
1313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** [sqlite3_file_control()] for this opcode should be a pointer to an integer.
1314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** That integer is 0 to disable persistent WAL mode or 1 to enable persistent
1315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL mode. If the integer is -1, then it is overwritten with the current
1316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WAL persistence setting.
1317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
1287 1318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
1288 1319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_FCNTL_LOCKSTATE 1
1289 1320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_GET_LOCKPROXYFILE 2
1290 1321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_SET_LOCKPROXYFILE 3
1291 1322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_LAST_ERRNO 4
1292 1323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_FCNTL_SIZE_HINT 5
1293 1324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_FCNTL_CHUNK_SIZE 6
1294 1325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_FCNTL_FILE_POINTER 7
1295 1326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_FCNTL_SYNC_OMITTED 8
1296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
1327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_FCNTL_WIN32_AV_RETRY 9
1328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_FCNTL_PERSIST_WAL 10
1297 1329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
1298 1330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
1299 1331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Mutex Handle
1300 1332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1301 1333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The mutex module within SQLite defines [sqlite3_mutex] to be an
@@ -1443,11 +1475,11 @@
1443 1475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The xSleep() method causes the calling thread to sleep for at
1444 1476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** least the number of microseconds given. ^The xCurrentTime()
1445 1477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** method returns a Julian Day Number for the current date and time as
1446 1478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a floating point value.
1447 1479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^The xCurrentTimeInt64() method returns, as an integer, the Julian
1448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Day Number multipled by 86400000 (the number of milliseconds in
1480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Day Number multiplied by 86400000 (the number of milliseconds in
1449 1481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a 24-hour day).
1450 1482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^SQLite will use the xCurrentTimeInt64() method to get the current
1451 1483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** date and time if that method is available (if iVersion is 2 or
1452 1484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** greater and the function pointer is not NULL) and will fall back
1453 1485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to xCurrentTime() if xCurrentTimeInt64() is unavailable.
@@ -1881,11 +1913,11 @@
1881 1913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** scratch memory beyond what is provided by this configuration option, then
1882 1914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [sqlite3_malloc()] will be used to obtain the memory needed.</dd>
1883 1915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
1884 1916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [[SQLITE_CONFIG_PAGECACHE]] <dt>SQLITE_CONFIG_PAGECACHE</dt>
1885 1917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** <dd> ^This option specifies a static memory buffer that SQLite can use for
1886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the database page cache with the default page cache implemenation.
1918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the database page cache with the default page cache implementation.
1887 1919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This configuration should not be used if an application-define page
1888 1920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** cache implementation is loaded using the SQLITE_CONFIG_PCACHE option.
1889 1921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** There are three arguments to this option: A pointer to 8-byte aligned
1890 1922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** memory, the size of each page buffer (sz), and the number of pages (N).
1891 1923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The sz argument should be the size of the largest database page
@@ -2979,16 +3011,16 @@
2979 3011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [[URI filenames in sqlite3_open()]] <h3>URI Filenames</h3>
2980 3012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
2981 3013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^If [URI filename] interpretation is enabled, and the filename argument
2982 3014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** begins with "file:", then the filename is interpreted as a URI. ^URI
2983 3015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** filename interpretation is enabled if the [SQLITE_OPEN_URI] flag is
2984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is set in the fourth argument to sqlite3_open_v2(), or if it has
3016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** set in the fourth argument to sqlite3_open_v2(), or if it has
2985 3017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** been enabled globally using the [SQLITE_CONFIG_URI] option with the
2986 3018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [sqlite3_config()] method or by the [SQLITE_USE_URI] compile-time option.
2987 3019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** As of SQLite version 3.7.7, URI filename interpretation is turned off
2988 3020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** by default, but future releases of SQLite might enable URI filename
2989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** intepretation by default. See "[URI filenames]" for additional
3021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** interpretation by default. See "[URI filenames]" for additional
2990 3022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** information.
2991 3023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
2992 3024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** URI filenames are parsed according to RFC 3986. ^If the URI contains an
2993 3025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** authority, then it must be either an empty string or the string
2994 3026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** "localhost". ^If the authority is not an empty string or "localhost", an
@@ -3365,11 +3397,11 @@
3365 3397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a schema change, on the first [sqlite3_step()] call following any change
3366 3398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to the [sqlite3_bind_text | bindings] of that [parameter].
3367 3399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^The specific value of WHERE-clause [parameter] might influence the
3368 3400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** choice of query plan if the parameter is the left-hand side of a [LIKE]
3369 3401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** or [GLOB] operator or if the parameter is compared to an indexed column
3370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** and the [SQLITE_ENABLE_STAT2] compile-time option is enabled.
3402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and the [SQLITE_ENABLE_STAT3] compile-time option is enabled.
3371 3403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the
3372 3404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** </li>
3373 3405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** </ol>
3374 3406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
3375 3407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_API int sqlite3_prepare(
@@ -3803,11 +3835,11 @@
3803 3835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [extended result codes] might be returned as well.
3804 3836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
3805 3837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^[SQLITE_BUSY] means that the database engine was unable to acquire the
3806 3838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** database locks it needs to do its job. ^If the statement is a [COMMIT]
3807 3839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** or occurs outside of an explicit transaction, then you can retry the
3808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** statement. If the statement is not a [COMMIT] and occurs within a
3840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** statement. If the statement is not a [COMMIT] and occurs within an
3809 3841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** explicit transaction then you should rollback the transaction before
3810 3842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** continuing.
3811 3843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
3812 3844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^[SQLITE_DONE] means that the statement has finished executing
3813 3845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** successfully. sqlite3_step() should not be called again on this virtual
@@ -4082,11 +4114,11 @@
4082 4114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
4083 4115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
4084 4116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: Destroy A Prepared Statement Object
4085 4117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
4086 4118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^The sqlite3_finalize() function is called to delete a [prepared statement].
4087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** ^If the most recent evaluation of the statement encountered no errors or
4119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^If the most recent evaluation of the statement encountered no errors
4088 4120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** or if the statement is never been evaluated, then sqlite3_finalize() returns
4089 4121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SQLITE_OK. ^If the most recent evaluation of statement S failed, then
4090 4122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3_finalize(S) returns the appropriate [error code] or
4091 4123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [extended error code].
4092 4124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -5996,11 +6028,11 @@
5996 6028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** versions of these routines, it should at least provide stubs that always
5997 6029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** return true so that one does not get spurious assertion failures.
5998 6030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
5999 6031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^If the argument to sqlite3_mutex_held() is a NULL pointer then
6000 6032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the routine should return 1. This seems counter-intuitive since
6001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** clearly the mutex cannot be held if it does not exist. But the
6033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** clearly the mutex cannot be held if it does not exist. But
6002 6034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the reason the mutex does not exist is because the build is not
6003 6035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** using mutexes. And we do not want the assert() containing the
6004 6036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** call to sqlite3_mutex_held() to fail, so a non-zero return is
6005 6037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the appropriate thing to do. ^The sqlite3_mutex_notheld()
6006 6038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** interface should also return 1 when given a NULL pointer.
@@ -6119,11 +6151,12 @@
6119 6151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_TESTCTRL_RESERVE 14
6120 6152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_TESTCTRL_OPTIMIZATIONS 15
6121 6153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_TESTCTRL_ISKEYWORD 16
6122 6154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_TESTCTRL_PGHDRSZ 17
6123 6155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_TESTCTRL_SCRATCHMALLOC 18
6124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQLITE_TESTCTRL_LAST 18
6156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_TESTCTRL_LOCALTIME_FAULT 19
6157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_TESTCTRL_LAST 19
6125 6158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
6126 6159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
6127 6160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** CAPI3REF: SQLite Runtime Status
6128 6161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
6129 6162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ^This interface is used to retrieve runtime status information
@@ -6505,11 +6538,11 @@
6505 6538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** [[the xFetch() page cache methods]]
6506 6539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The xFetch() method locates a page in the cache and returns a pointer to
6507 6540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the page, or a NULL pointer.
6508 6541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A "page", in this context, means a buffer of szPage bytes aligned at an
6509 6542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 8-byte boundary. The page to be fetched is determined by the key. ^The
6510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** mimimum key value is 1. After it has been retrieved using xFetch, the page
6543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** minimum key value is 1. After it has been retrieved using xFetch, the page
6511 6544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is considered to be "pinned".
6512 6545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
6513 6546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the requested page is already in the page cache, then the page cache
6514 6547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** implementation must return a pointer to the page buffer with its content
6515 6548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** intact. If the requested page is not already in the cache, then the
@@ -7678,10 +7711,22 @@
7678 7711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is 0x00000000ffffffff. But because of quirks of some compilers, we
7679 7712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** have to specify the value in the less intuitive manner shown:
7680 7713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
7681 7714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_MAX_U32 ((((u64)1)<<32)-1)
7682 7715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
7716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
7717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The datatype used to store estimates of the number of rows in a
7718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** table or index. This is an unsigned integer type. For 99.9% of
7719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the world, a 32-bit integer is sufficient. But a 64-bit integer
7720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** can be used at compile-time if desired.
7721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
7722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_64BIT_STATS
7723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef u64 tRowcnt; /* 64-bit only if requested at compile-time */
7724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
7725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef u32 tRowcnt; /* 32-bit is the default */
7726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
7727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
7683 7728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
7684 7729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Macros to determine whether the machine is big or little endian,
7685 7730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** evaluated at runtime.
7686 7731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
7687 7732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_AMALGAMATION
@@ -8483,10 +8528,11 @@
8483 8528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3VdbeAddOp2(Vdbe*,int,int,int);
8484 8529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3VdbeAddOp3(Vdbe*,int,int,int,int);
8485 8530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3VdbeAddOp4(Vdbe*,int,int,int,int,const char *zP4,int);
8486 8531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(Vdbe*,int,int,int,int,int);
8487 8532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3VdbeAddOpList(Vdbe*, int nOp, VdbeOpList const *aOp);
8533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe*,int,char*);
8488 8534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3VdbeChangeP1(Vdbe*, int addr, int P1);
8489 8535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3VdbeChangeP2(Vdbe*, int addr, int P2);
8490 8536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3VdbeChangeP3(Vdbe*, int addr, int P3);
8491 8537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3VdbeChangeP5(Vdbe*, u8 P5);
8492 8538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe*, int addr);
@@ -9282,11 +9328,11 @@
9282 9328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3_close().
9283 9329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*
9284 9330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A thread must be holding a mutex on the corresponding Btree in order
9285 9331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to access Schema content. This implies that the thread must also be
9286 9332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** holding a mutex on the sqlite3 connection pointer that owns the Btree.
9287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** For a TEMP Schema, on the connection mutex is required.
9333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** For a TEMP Schema, only the connection mutex is required.
9288 9334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
9289 9335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Schema {
9290 9336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int schema_cookie; /* Database schema version number for this file */
9291 9337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iGeneration; /* Generation counter. Incremented with each change */
9292 9338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Hash tblHash; /* All tables indexed by name */
@@ -9555,10 +9601,12 @@
9555 9601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_IndexSort 0x04 /* Disable indexes for sorting */
9556 9602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_IndexSearch 0x08 /* Disable indexes for searching */
9557 9603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_IndexCover 0x10 /* Disable index covering table */
9558 9604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_GroupByOrder 0x20 /* Disable GROUPBY cover of ORDERBY */
9559 9605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_FactorOutConst 0x40 /* Disable factoring out constants */
9606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_IdxRealAsInt 0x80 /* Store REAL as INT in indices */
9607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQLITE_DistinctOpt 0x80 /* DISTINCT using indexes */
9560 9608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_OptMask 0xff /* Mask of all disablable opts */
9561 9609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
9562 9610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
9563 9611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Possible values for the sqlite.magic field.
9564 9612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The numbers are obtained at random and have no special meaning, other
@@ -9876,11 +9924,11 @@
9876 9924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iPKey; /* If not negative, use aCol[iPKey] as the primary key */
9877 9925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nCol; /* Number of columns in this table */
9878 9926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Column *aCol; /* Information about each column */
9879 9927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Index *pIndex; /* List of SQL indexes on this table. */
9880 9928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int tnum; /* Root BTree node for this table (see note above) */
9881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned nRowEst; /* Estimated rows in table - from sqlite_stat1 table */
9929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt nRowEst; /* Estimated rows in table - from sqlite_stat1 table */
9882 9930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Select *pSelect; /* NULL for tables. Points to definition if a view. */
9883 9931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u16 nRef; /* Number of pointers to this Table */
9884 9932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 tabFlags; /* Mask of TF_* values */
9885 9933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 keyConf; /* What to do in case of uniqueness conflict on iPKey */
9886 9934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
FKey *pFKey; /* Linked list of all foreign keys in this table */
@@ -10075,35 +10123,43 @@
10075 10123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
10076 10124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Index {
10077 10125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zName; /* Name of this index */
10078 10126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nColumn; /* Number of columns in the table used by this index */
10079 10127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int *aiColumn; /* Which columns are used by this index. 1st is 0 */
10080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned *aiRowEst; /* Result of ANALYZE: Est. rows selected by each column */
10128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt *aiRowEst; /* Result of ANALYZE: Est. rows selected by each column */
10081 10129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Table *pTable; /* The SQL table being indexed */
10082 10130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int tnum; /* Page containing root of this index in database file */
10083 10131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 onError; /* OE_Abort, OE_Ignore, OE_Replace, or OE_None */
10084 10132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 autoIndex; /* True if is automatically created (ex: by UNIQUE) */
10085 10133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 bUnordered; /* Use this index for == or IN queries only */
10134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 nSample; /* Number of elements in aSample[] */
10086 10135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zColAff; /* String defining the affinity of each column */
10087 10136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Index *pNext; /* The next index associated with the same table */
10088 10137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Schema *pSchema; /* Schema containing this index */
10089 10138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 *aSortOrder; /* Array of size Index.nColumn. True==DESC, False==ASC */
10090 10139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char **azColl; /* Array of collation sequence names for index */
10091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- IndexSample *aSample; /* Array of SQLITE_INDEX_SAMPLES samples */
10140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
10141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt avgEq; /* Average nEq value for key values not in aSample */
10142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ IndexSample *aSample; /* Samples of the left-most key */
10143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
10092 10144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
10093 10145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
10094 10146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
10095 10147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Each sample stored in the sqlite_stat2 table is represented in memory
10096 10148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** using a structure of this type.
10097 10149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
10098 10150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct IndexSample {
10099 10151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
union {
10100 10152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *z; /* Value if eType is SQLITE_TEXT or SQLITE_BLOB */
10101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- double r; /* Value if eType is SQLITE_FLOAT or SQLITE_INTEGER */
10153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double r; /* Value if eType is SQLITE_FLOAT */
10154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 i; /* Value if eType is SQLITE_INTEGER */
10102 10155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} u;
10103 10156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 eType; /* SQLITE_NULL, SQLITE_INTEGER ... etc. */
10104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u8 nByte; /* Size in byte of text or blob. */
10157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u16 nByte; /* Size in byte of text or blob. */
10158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt nEq; /* Est. number of rows where the key equals this sample */
10159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt nLt; /* Est. number of rows where key is less than this sample */
10160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt nDLt; /* Est. number of distinct keys less than this sample */
10105 10161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
10106 10162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
10107 10163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
10108 10164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Each token coming out of the lexer is an instance of
10109 10165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** this structure. Tokens are also used as part of an expression.
@@ -10446,10 +10502,11 @@
10446 10502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Table *pTab; /* An SQL table corresponding to zName */
10447 10503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Select *pSelect; /* A SELECT statement used in place of a table name */
10448 10504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 isPopulated; /* Temporary table associated with SELECT is populated */
10449 10505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 jointype; /* Type of join between this able and the previous */
10450 10506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 notIndexed; /* True if there is a NOT INDEXED clause */
10507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 isCorrelated; /* True if sub-query is correlated */
10451 10508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_EXPLAIN
10452 10509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 iSelectId; /* If pSelect!=0, the id of the sub-select in EQP */
10453 10510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
10454 10511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iCursor; /* The VDBE cursor number used to access this table */
10455 10512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pOn; /* The ON clause of a join */
@@ -10565,10 +10622,11 @@
10565 10622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct WhereInfo {
10566 10623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Parse *pParse; /* Parsing and code generating context */
10567 10624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u16 wctrlFlags; /* Flags originally passed to sqlite3WhereBegin() */
10568 10625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 okOnePass; /* Ok to use one-pass algorithm for UPDATE or DELETE */
10569 10626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 untestedTerms; /* Not all WHERE terms resolved by outer loop */
10627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 eDistinct;
10570 10628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SrcList *pTabList; /* List of tables in the join */
10571 10629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iTop; /* The very beginning of the WHERE loop */
10572 10630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iContinue; /* Jump here to continue with next record */
10573 10631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iBreak; /* Jump here to break out of the loop */
10574 10632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nLevel; /* Number of nested loop */
@@ -10576,10 +10634,13 @@
10576 10634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
double savedNQueryLoop; /* pParse->nQueryLoop outside the WHERE loop */
10577 10635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
double nRowOut; /* Estimated number of output rows */
10578 10636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereLevel a[1]; /* Information about each nest loop in WHERE */
10579 10637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
10580 10638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
10639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WHERE_DISTINCT_UNIQUE 1
10640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WHERE_DISTINCT_ORDERED 2
10641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
10581 10642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
10582 10643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A NameContext defines a context in which to resolve table and column
10583 10644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** names. The context consists of a list of tables (the pSrcList) field and
10584 10645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a list of named expression (pEList). The named expression list may
10585 10646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be NULL. The pSrc corresponds to the FROM clause of a SELECT or
@@ -11052,10 +11113,11 @@
11052 11113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isPCacheInit; /* True after malloc is initialized */
11053 11114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_mutex *pInitMutex; /* Mutex used by sqlite3_initialize() */
11054 11115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nRefInitMutex; /* Number of users of pInitMutex */
11055 11116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void (*xLog)(void*,int,const char*); /* Function for logging */
11056 11117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pLogArg; /* First argument to xLog() */
11118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bLocaltimeFault; /* True to fail localtime() calls */
11057 11119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
11058 11120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
11059 11121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
11060 11122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Context pointer passed down through the tree-walk.
11061 11123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -11299,10 +11361,11 @@
11299 11361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
11300 11362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define sqlite3ViewGetColumnNames(A,B) 0
11301 11363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
11302 11364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
11303 11365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3DropTable(Parse*, SrcList*, int, int);
11366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3CodeDropTable(Parse*, Table*, int, int);
11304 11367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3DeleteTable(sqlite3*, Table*);
11305 11368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_AUTOINCREMENT
11306 11369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3AutoincrementBegin(Parse *pParse);
11307 11370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3AutoincrementEnd(Parse *pParse);
11308 11371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
@@ -11336,11 +11399,11 @@
11336 11399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(SQLITE_ENABLE_UPDATE_DELETE_LIMIT) && !defined(SQLITE_OMIT_SUBQUERY)
11337 11400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE Expr *sqlite3LimitWhere(Parse *, SrcList *, Expr *, ExprList *, Expr *, Expr *, char *);
11338 11401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
11339 11402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3DeleteFrom(Parse*, SrcList*, Expr*);
11340 11403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Update(Parse*, SrcList*, ExprList*, Expr*, int);
11341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*, SrcList*, Expr*, ExprList**, u16);
11404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(Parse*, SrcList*, Expr*, ExprList**,ExprList*,u16);
11342 11405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3WhereEnd(WhereInfo*);
11343 11406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3ExprCodeGetColumn(Parse*, Table*, int, int, int);
11344 11407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ExprCodeGetColumnOfTable(Vdbe*, Table*, int, int, int);
11345 11408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ExprCodeMove(Parse*, int, int, int);
11346 11409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ExprCodeCopy(Parse*, int, int, int);
@@ -11479,11 +11542,11 @@
11479 11542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3AtoF(const char *z, double*, int, u8);
11480 11543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3GetInt32(const char *, int*);
11481 11544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Atoi(const char*);
11482 11545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Utf16ByteLen(const void *pData, int nChar);
11483 11546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Utf8CharLen(const char *pData, int nByte);
11484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Utf8Read(const u8*, const u8**);
11547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE u32 sqlite3Utf8Read(const u8*, const u8**);
11485 11548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
11486 11549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
11487 11550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Routines to read and write variable-length integers. These used to
11488 11551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be defined locally, but now we use the varint routines in the util.c
11489 11552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file. Code should use the MACRO forms below, as the Varint32 versions
@@ -11555,11 +11618,11 @@
11555 11618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ValueSetStr(sqlite3_value*, int, const void *,u8,
11556 11619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void(*)(void*));
11557 11620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ValueFree(sqlite3_value*);
11558 11621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE sqlite3_value *sqlite3ValueNew(sqlite3 *);
11559 11622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE char *sqlite3Utf16to8(sqlite3 *, const void*, int, u8);
11560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
11623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
11561 11624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE char *sqlite3Utf8to16(sqlite3 *, u8, char *, int, int *);
11562 11625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
11563 11626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3ValueFromExpr(sqlite3 *, Expr *, u8, u8, sqlite3_value **);
11564 11627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3ValueApplyAffinity(sqlite3_value *, u8, u8);
11565 11628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_AMALGAMATION
@@ -12012,10 +12075,11 @@
12012 12075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* isPCacheInit */
12013 12076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* pInitMutex */
12014 12077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* nRefInitMutex */
12015 12078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* xLog */
12016 12079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0, /* pLogArg */
12080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* bLocaltimeFault */
12017 12081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
12018 12082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
12019 12083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
12020 12084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
12021 12085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Hash table for global functions - functions common to all
@@ -12180,10 +12244,13 @@
12180 12244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_ENABLE_RTREE
12181 12245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"ENABLE_RTREE",
12182 12246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
12183 12247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_ENABLE_STAT2
12184 12248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"ENABLE_STAT2",
12249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
12250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
12251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "ENABLE_STAT3",
12185 12252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
12186 12253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_ENABLE_UNLOCK_NOTIFY
12187 12254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"ENABLE_UNLOCK_NOTIFY",
12188 12255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
12189 12256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_ENABLE_UPDATE_DELETE_LIMIT
@@ -13162,26 +13229,10 @@
13162 13229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
13163 13230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <time.h>
13164 13231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
13165 13232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_DATETIME_FUNCS
13166 13233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
13167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
13168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** On recent Windows platforms, the localtime_s() function is available
13169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** as part of the "Secure CRT". It is essentially equivalent to
13170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** localtime_r() available under most POSIX platforms, except that the
13171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** order of the parameters is reversed.
13172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
13173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** See http://msdn.microsoft.com/en-us/library/a442x3ye(VS.80).aspx.
13174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
13175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If the user has not indicated to use localtime_r() or localtime_s()
13176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** already, check for an MSVC build environment that provides
13177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** localtime_s().
13178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
13179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if !defined(HAVE_LOCALTIME_R) && !defined(HAVE_LOCALTIME_S) && \
13180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- defined(_MSC_VER) && defined(_CRT_INSECURE_DEPRECATE)
13181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define HAVE_LOCALTIME_S 1
13182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
13183 13234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
13184 13235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
13185 13236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A structure for holding a single date and time.
13186 13237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
13187 13238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct DateTime DateTime;
@@ -13522,20 +13573,90 @@
13522 13573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void clearYMD_HMS_TZ(DateTime *p){
13523 13574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->validYMD = 0;
13524 13575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->validHMS = 0;
13525 13576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->validTZ = 0;
13526 13577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
13578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
13579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
13580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** On recent Windows platforms, the localtime_s() function is available
13581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** as part of the "Secure CRT". It is essentially equivalent to
13582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** localtime_r() available under most POSIX platforms, except that the
13583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** order of the parameters is reversed.
13584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
13585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** See http://msdn.microsoft.com/en-us/library/a442x3ye(VS.80).aspx.
13586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
13587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the user has not indicated to use localtime_r() or localtime_s()
13588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** already, check for an MSVC build environment that provides
13589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** localtime_s().
13590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
13591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if !defined(HAVE_LOCALTIME_R) && !defined(HAVE_LOCALTIME_S) && \
13592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ defined(_MSC_VER) && defined(_CRT_INSECURE_DEPRECATE)
13593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define HAVE_LOCALTIME_S 1
13594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
13595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
13596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_LOCALTIME
13597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
13598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The following routine implements the rough equivalent of localtime_r()
13599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** using whatever operating-system specific localtime facility that
13600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is available. This routine returns 0 on success and
13601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** non-zero on any kind of error.
13602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
13603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the sqlite3GlobalConfig.bLocaltimeFault variable is true then this
13604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** routine will always fail.
13605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
13606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int osLocaltime(time_t *t, struct tm *pTm){
13607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
13608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if (!defined(HAVE_LOCALTIME_R) || !HAVE_LOCALTIME_R) \
13609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (!defined(HAVE_LOCALTIME_S) || !HAVE_LOCALTIME_S)
13610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct tm *pX;
13611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if SQLITE_THREADSAFE>0
13612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex *mutex = sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER);
13613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
13614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_enter(mutex);
13615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pX = localtime(t);
13616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_BUILTIN_TEST
13617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3GlobalConfig.bLocaltimeFault ) pX = 0;
13618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
13619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pX ) *pTm = *pX;
13620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_leave(mutex);
13621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pX==0;
13622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
13623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_BUILTIN_TEST
13624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3GlobalConfig.bLocaltimeFault ) return 1;
13625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
13626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(HAVE_LOCALTIME_R) && HAVE_LOCALTIME_R
13627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = localtime_r(t, pTm)==0;
13628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
13629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = localtime_s(pTm, t);
13630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* HAVE_LOCALTIME_R */
13631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* HAVE_LOCALTIME_R || HAVE_LOCALTIME_S */
13632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
13633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
13634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_OMIT_LOCALTIME */
13635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
13527 13636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
13528 13637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_LOCALTIME
13529 13638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
13530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Compute the difference (in milliseconds)
13531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** between localtime and UTC (a.k.a. GMT)
13532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** for the time value p where p is in UTC.
13639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Compute the difference (in milliseconds) between localtime and UTC
13640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (a.k.a. GMT) for the time value p where p is in UTC. If no error occurs,
13641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** return this value and set *pRc to SQLITE_OK.
13642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
13643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Or, if an error does occur, set *pRc to SQLITE_ERROR. The returned value
13644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is undefined in this case.
13533 13645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
13534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static sqlite3_int64 localtimeOffset(DateTime *p){
13646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static sqlite3_int64 localtimeOffset(
13647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DateTime *p, /* Date at which to calculate offset */
13648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_context *pCtx, /* Write error here if one occurs */
13649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pRc /* OUT: Error code. SQLITE_OK or ERROR */
13650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
13535 13651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DateTime x, y;
13536 13652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
time_t t;
13653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct tm sLocal;
13654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
13655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Initialize the contents of sLocal to avoid a compiler warning. */
13656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&sLocal, 0, sizeof(sLocal));
13657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
13537 13658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
x = *p;
13538 13659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
computeYMD_HMS(&x);
13539 13660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( x.Y<1971 || x.Y>=2038 ){
13540 13661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
x.Y = 2000;
13541 13662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
x.M = 1;
@@ -13549,51 +13670,27 @@
13549 13670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
13550 13671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
x.tz = 0;
13551 13672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
x.validJD = 0;
13552 13673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
computeJD(&x);
13553 13674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
t = (time_t)(x.iJD/1000 - 21086676*(i64)10000);
13554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef HAVE_LOCALTIME_R
13555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- {
13556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct tm sLocal;
13557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- localtime_r(&t, &sLocal);
13558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.Y = sLocal.tm_year + 1900;
13559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.M = sLocal.tm_mon + 1;
13560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.D = sLocal.tm_mday;
13561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.h = sLocal.tm_hour;
13562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.m = sLocal.tm_min;
13563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.s = sLocal.tm_sec;
13564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
13565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #elif defined(HAVE_LOCALTIME_S) && HAVE_LOCALTIME_S
13566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- {
13567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct tm sLocal;
13568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- localtime_s(&sLocal, &t);
13569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.Y = sLocal.tm_year + 1900;
13570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.M = sLocal.tm_mon + 1;
13571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.D = sLocal.tm_mday;
13572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.h = sLocal.tm_hour;
13573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.m = sLocal.tm_min;
13574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.s = sLocal.tm_sec;
13575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
13576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #else
13577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- {
13578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct tm *pTm;
13579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_mutex_enter(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
13580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTm = localtime(&t);
13581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.Y = pTm->tm_year + 1900;
13582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.M = pTm->tm_mon + 1;
13583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.D = pTm->tm_mday;
13584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.h = pTm->tm_hour;
13585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.m = pTm->tm_min;
13586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- y.s = pTm->tm_sec;
13587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_mutex_leave(sqlite3MutexAlloc(SQLITE_MUTEX_STATIC_MASTER));
13588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
13589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
13675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( osLocaltime(&t, &sLocal) ){
13676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_result_error(pCtx, "local time unavailable", -1);
13677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRc = SQLITE_ERROR;
13678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
13679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
13680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ y.Y = sLocal.tm_year + 1900;
13681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ y.M = sLocal.tm_mon + 1;
13682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ y.D = sLocal.tm_mday;
13683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ y.h = sLocal.tm_hour;
13684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ y.m = sLocal.tm_min;
13685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ y.s = sLocal.tm_sec;
13590 13686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
y.validYMD = 1;
13591 13687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
y.validHMS = 1;
13592 13688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
y.validJD = 0;
13593 13689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
y.validTZ = 0;
13594 13690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
computeJD(&y);
13691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRc = SQLITE_OK;
13595 13692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return y.iJD - x.iJD;
13596 13693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
13597 13694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_OMIT_LOCALTIME */
13598 13695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
13599 13696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -13613,13 +13710,16 @@
13613 13710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** weekday N
13614 13711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** unixepoch
13615 13712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** localtime
13616 13713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** utc
13617 13714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
13618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Return 0 on success and 1 if there is any kind of error.
13715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return 0 on success and 1 if there is any kind of error. If the error
13716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is in a system call (i.e. localtime()), then an error message is written
13717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to context pCtx. If the error is an unrecognized modifier, no error is
13718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** written to pCtx.
13619 13719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
13620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int parseModifier(const char *zMod, DateTime *p){
13720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int parseModifier(sqlite3_context *pCtx, const char *zMod, DateTime *p){
13621 13721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = 1;
13622 13722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n;
13623 13723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
double r;
13624 13724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *z, zBuf[30];
13625 13725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
z = zBuf;
@@ -13635,13 +13735,12 @@
13635 13735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Assuming the current time value is UTC (a.k.a. GMT), shift it to
13636 13736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** show local time.
13637 13737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
13638 13738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( strcmp(z, "localtime")==0 ){
13639 13739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
computeJD(p);
13640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iJD += localtimeOffset(p);
13740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->iJD += localtimeOffset(p, pCtx, &rc);
13641 13741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
clearYMD_HMS_TZ(p);
13642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = 0;
13643 13742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
13644 13743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
13645 13744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
13646 13745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
13647 13746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case 'u': {
@@ -13658,15 +13757,16 @@
13658 13757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
13659 13758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_LOCALTIME
13660 13759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
else if( strcmp(z, "utc")==0 ){
13661 13760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 c1;
13662 13761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
computeJD(p);
13663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- c1 = localtimeOffset(p);
13664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iJD -= c1;
13665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- clearYMD_HMS_TZ(p);
13666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->iJD += c1 - localtimeOffset(p);
13667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = 0;
13762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ c1 = localtimeOffset(p, pCtx, &rc);
13763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
13764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->iJD -= c1;
13765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ clearYMD_HMS_TZ(p);
13766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->iJD += c1 - localtimeOffset(p, pCtx, &rc);
13767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
13668 13768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
13669 13769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
13670 13770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
13671 13771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
13672 13772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case 'w': {
@@ -13843,13 +13943,12 @@
13843 13943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !z || parseDateOrTime(context, (char*)z, p) ){
13844 13944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
13845 13945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
13846 13946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
13847 13947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=1; i<argc; i++){
13848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (z = sqlite3_value_text(argv[i]))==0 || parseModifier((char*)z, p) ){
13849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 1;
13850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
13948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ z = sqlite3_value_text(argv[i]);
13949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( z==0 || parseModifier(context, (char*)z, p) ) return 1;
13851 13950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
13852 13951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
13853 13952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
13854 13953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
13855 13954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -14343,11 +14442,11 @@
14343 14442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DO_OS_MALLOC_TEST(0);
14344 14443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 0x87f3f is a mask of SQLITE_OPEN_ flags that are valid to be passed
14345 14444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** down into the VFS layer. Some SQLITE_OPEN_ flags (for example,
14346 14445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SQLITE_OPEN_FULLMUTEX or SQLITE_OPEN_SHAREDCACHE) are blocked before
14347 14446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** reaching the VFS. */
14348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x87f3f, pFlagsOut);
14447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pVfs->xOpen(pVfs, zPath, pFile, flags & 0x87f7f, pFlagsOut);
14349 14448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( rc==SQLITE_OK || pFile->pMethods==0 );
14350 14449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
14351 14450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
14352 14451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3OsDelete(sqlite3_vfs *pVfs, const char *zPath, int dirSync){
14353 14452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return pVfs->xDelete(pVfs, zPath, dirSync);
@@ -15804,11 +15903,11 @@
15804 15903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Free an outstanding memory allocation.
15805 15904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
15806 15905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function assumes that the necessary mutexes, if any, are
15807 15906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** already held by the caller. Hence "Unsafe".
15808 15907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void memsys3FreeUnsafe(void *pOld){
15908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void memsys3FreeUnsafe(void *pOld){
15810 15909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem3Block *p = (Mem3Block*)pOld;
15811 15910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
15812 15911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u32 size, x;
15813 15912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( sqlite3_mutex_held(mem3.mutex) );
15814 15913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p>mem3.aPool && p<&mem3.aPool[mem3.nPool] );
@@ -15879,21 +15978,21 @@
15879 15978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15880 15979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15881 15980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
15882 15981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Free memory.
15883 15982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void memsys3Free(void *pPrior){
15983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void memsys3Free(void *pPrior){
15885 15984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPrior );
15886 15985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memsys3Enter();
15887 15986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memsys3FreeUnsafe(pPrior);
15888 15987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memsys3Leave();
15889 15988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
15890 15989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15891 15990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
15892 15991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Change the size of an existing memory allocation
15893 15992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
15894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void *memsys3Realloc(void *pPrior, int nBytes){
15993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void *memsys3Realloc(void *pPrior, int nBytes){
15895 15994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nOld;
15896 15995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *p;
15897 15996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPrior==0 ){
15898 15997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return sqlite3_malloc(nBytes);
15899 15998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -20086,11 +20185,11 @@
20086 20185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} \
20087 20186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( c<0x80 \
20088 20187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| (c&0xFFFFF800)==0xD800 \
20089 20188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| (c&0xFFFFFFFE)==0xFFFE ){ c = 0xFFFD; } \
20090 20189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
20091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Utf8Read(
20190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE u32 sqlite3Utf8Read(
20092 20191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const unsigned char *zIn, /* First byte of UTF-8 character */
20093 20192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const unsigned char **pzNext /* Write first byte past UTF-8 char here */
20094 20193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
20095 20194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int c;
20096 20195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -20387,11 +20486,11 @@
20387 20486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** no longer required.
20388 20487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
20389 20488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If a malloc failure occurs, NULL is returned and the db.mallocFailed
20390 20489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** flag set.
20391 20490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
20392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
20491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
20393 20492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE char *sqlite3Utf8to16(sqlite3 *db, u8 enc, char *z, int n, int *pnOut){
20394 20493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Mem m;
20395 20494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&m, 0, sizeof(m));
20396 20495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m.db = db;
20397 20496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeMemSetStr(&m, z, n, SQLITE_UTF8, SQLITE_STATIC);
@@ -21633,26 +21732,32 @@
21633 21732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return -x;
21634 21733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
21635 21734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21636 21735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_ENABLE_8_3_NAMES
21637 21736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
21638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If SQLITE_ENABLE_8_3_NAME is set at compile-time and if the database
21737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If SQLITE_ENABLE_8_3_NAMES is set at compile-time and if the database
21639 21738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** filename in zBaseFilename is a URI with the "8_3_names=1" parameter and
21640 21739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** if filename in z[] has a suffix (a.k.a. "extension") that is longer than
21641 21740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** three characters, then shorten the suffix on z[] to be the last three
21642 21741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** characters of the original suffix.
21742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
21743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If SQLITE_ENABLE_8_3_NAMES is set to 2 at compile-time, then always
21744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** do the suffix shortening regardless of URI parameter.
21643 21745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
21644 21746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Examples:
21645 21747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
21646 21748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** test.db-journal => test.nal
21647 21749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** test.db-wal => test.wal
21648 21750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** test.db-shm => test.shm
21649 21751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
21650 21752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3FileSuffix3(const char *zBaseFilename, char *z){
21753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if SQLITE_ENABLE_8_3_NAMES<2
21651 21754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zOk;
21652 21755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zOk = sqlite3_uri_parameter(zBaseFilename, "8_3_names");
21653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zOk && sqlite3GetBoolean(zOk) ){
21756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zOk && sqlite3GetBoolean(zOk) )
21757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
21758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ {
21654 21759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i, sz;
21655 21760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sz = sqlite3Strlen30(z);
21656 21761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=sz-1; i>0 && z[i]!='/' && z[i]!='.'; i--){}
21657 21762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( z[i]=='.' && ALWAYS(sz>i+4) ) memcpy(&z[i+1], &z[sz-3], 4);
21658 21763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -22182,14 +22287,17 @@
22182 22287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef MEMORY_DEBUG
22183 22288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
22184 22289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
22185 22290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
22186 22291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
22187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3OSTrace = 0;
22188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X
22292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ifndef SQLITE_DEBUG_OS_TRACE
22293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define SQLITE_DEBUG_OS_TRACE 0
22294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # endif
22295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sqlite3OSTrace = SQLITE_DEBUG_OS_TRACE;
22296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X
22189 22297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
22190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE(X)
22298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define OSTRACE(X)
22191 22299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
22192 22300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
22193 22301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
22194 22302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Macros for performance tracing. Normally turned off. Only works
22195 22303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** on i486 hardware.
@@ -24363,10 +24471,14 @@
24363 24471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24364 24472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(__APPLE__) || (SQLITE_ENABLE_LOCKING_STYLE && !OS_VXWORKS)
24365 24473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# include <sys/mount.h>
24366 24474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
24367 24475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef HAVE_UTIME
24477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # include <utime.h>
24478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
24479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
24368 24480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24369 24481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Allowed values of unixFile.fsFlags
24370 24482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24371 24483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_FSFLAGS_IS_MSDOS 0x1
24372 24484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -24428,11 +24540,10 @@
24428 24540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct unixFile unixFile;
24429 24541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct unixFile {
24430 24542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_io_methods const *pMethod; /* Always the first entry */
24431 24543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixInodeInfo *pInode; /* Info about locks on this inode */
24432 24544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int h; /* The file descriptor */
24433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int dirfd; /* File descriptor for the directory */
24434 24545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned char eFileLock; /* The type of lock held on this fd */
24435 24546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned char ctrlFlags; /* Behavioral bits. UNIXFILE_* flags */
24436 24547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int lastErrno; /* The unix errno from last I/O error */
24437 24548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *lockingContext; /* Locking style specific state */
24438 24549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UnixUnusedFd *pUnused; /* Pre-allocated UnixUnusedFd */
@@ -24470,12 +24581,14 @@
24470 24581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
24471 24582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24472 24583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24473 24584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Allowed values for the unixFile.ctrlFlags bitmask:
24474 24585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define UNIXFILE_EXCL 0x01 /* Connections from one process only */
24476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define UNIXFILE_RDONLY 0x02 /* Connection is read only */
24586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define UNIXFILE_EXCL 0x01 /* Connections from one process only */
24587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define UNIXFILE_RDONLY 0x02 /* Connection is read only */
24588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define UNIXFILE_PERSIST_WAL 0x04 /* Persistent WAL mode */
24589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define UNIXFILE_DIRSYNC 0x08 /* Directory sync needed */
24477 24590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24478 24591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24479 24592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Include code that is common to all os_*.c files
24480 24593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24481 24594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** Include os_common.h in the middle of os_unix.c ***************/
@@ -24510,14 +24623,17 @@
24510 24623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef MEMORY_DEBUG
24511 24624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
24512 24625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
24513 24626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24514 24627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
24515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3OSTrace = 0;
24516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X
24628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ifndef SQLITE_DEBUG_OS_TRACE
24629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define SQLITE_DEBUG_OS_TRACE 0
24630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # endif
24631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sqlite3OSTrace = SQLITE_DEBUG_OS_TRACE;
24632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X
24517 24633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
24518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE(X)
24634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define OSTRACE(X)
24519 24635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
24520 24636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24521 24637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24522 24638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Macros for performance tracing. Normally turned off. Only works
24523 24639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** on i486 hardware.
@@ -24722,10 +24838,13 @@
24722 24838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
24723 24839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int posixOpen(const char *zFile, int flags, int mode){
24724 24840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return open(zFile, flags, mode);
24725 24841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
24726 24842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Forward reference */
24844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int openDirectory(const char*, int*);
24845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
24727 24846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24728 24847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Many system calls are accessed through pointer-to-functions so that
24729 24848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** they may be overridden at runtime to facilitate fault injection during
24730 24849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** testing and sandboxing. The following array holds the names and pointers
24731 24850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to all overrideable system calls.
@@ -24818,10 +24937,16 @@
24818 24937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
24819 24938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{ "fallocate", (sqlite3_syscall_ptr)0, 0 },
24820 24939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
24821 24940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define osFallocate ((int(*)(int,off_t,off_t))aSyscall[15].pCurrent)
24822 24941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "unlink", (sqlite3_syscall_ptr)unlink, 0 },
24943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define osUnlink ((int(*)(const char*))aSyscall[16].pCurrent)
24944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
24945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "openDirectory", (sqlite3_syscall_ptr)openDirectory, 0 },
24946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define osOpenDirectory ((int(*)(const char*,int*))aSyscall[17].pCurrent)
24947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
24823 24948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}; /* End of the overrideable system calls */
24824 24949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24825 24950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
24826 24951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This is the xSetSystemCall() method of sqlite3_vfs for all of the
24827 24952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** "unix" VFSes. Return SQLITE_OK opon successfully updating the
@@ -25102,11 +25227,13 @@
25102 25227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case EINVAL:
25103 25228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case ENOTCONN:
25104 25229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case ENODEV:
25105 25230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case ENXIO:
25106 25231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case ENOENT:
25232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef ESTALE /* ESTALE is not defined on Interix systems */
25107 25233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case ESTALE:
25234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
25108 25235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case ENOSYS:
25109 25236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* these should force the client to close the file and reconnect */
25110 25237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
25111 25238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
default:
25112 25239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return sqliteIOErr;
@@ -26172,22 +26299,18 @@
26172 26299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** even on VxWorks. A mutex will be acquired on VxWorks by the
26173 26300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** vxworksReleaseFileId() routine.
26174 26301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
26175 26302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int closeUnixFile(sqlite3_file *id){
26176 26303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pFile = (unixFile*)id;
26177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->dirfd>=0 ){
26178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- robust_close(pFile, pFile->dirfd, __LINE__);
26179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->dirfd=-1;
26180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
26181 26304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pFile->h>=0 ){
26182 26305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
robust_close(pFile, pFile->h, __LINE__);
26183 26306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->h = -1;
26184 26307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26185 26308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if OS_VXWORKS
26186 26309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pFile->pId ){
26187 26310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pFile->isDelete ){
26188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unlink(pFile->pId->zCanonicalName);
26311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ osUnlink(pFile->pId->zCanonicalName);
26189 26312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26190 26313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
vxworksReleaseFileId(pFile->pId);
26191 26314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->pId = 0;
26192 26315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26193 26316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
@@ -26368,12 +26491,14 @@
26368 26491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If we have any lock, then the lock file already exists. All we have
26369 26492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to do is adjust our internal record of the lock level.
26370 26493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
26371 26494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pFile->eFileLock > NO_LOCK ){
26372 26495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->eFileLock = eFileLock;
26373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if !OS_VXWORKS
26374 26496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Always update the timestamp on the old file */
26497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef HAVE_UTIME
26498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ utime(zLockFile, NULL);
26499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
26375 26500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
utimes(zLockFile, NULL);
26376 26501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
26377 26502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
26378 26503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26379 26504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -26430,11 +26555,11 @@
26430 26555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
26431 26556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
26432 26557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
26433 26558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* To fully unlock the database, delete the lock file */
26434 26559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( eFileLock==NO_LOCK );
26435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( unlink(zLockFile) ){
26560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( osUnlink(zLockFile) ){
26436 26561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = 0;
26437 26562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int tErrno = errno;
26438 26563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( ENOENT != tErrno ){
26439 26564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_IOERR_UNLOCK;
26440 26565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -27665,10 +27790,54 @@
27665 27790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( OS_VXWORKS && rc!= -1 ){
27666 27791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = 0;
27667 27792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27668 27793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
27669 27794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
27796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
27797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Open a file descriptor to the directory containing file zFilename.
27798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If successful, *pFd is set to the opened file descriptor and
27799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM
27800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined
27801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** value.
27802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
27803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The directory file descriptor is used for only one thing - to
27804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fsync() a directory to make sure file creation and deletion events
27805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are flushed to disk. Such fsyncs are not needed on newer
27806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** journaling filesystems, but are required on older filesystems.
27807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
27808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine can be overridden using the xSetSysCall interface.
27809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The ability to override this routine was added in support of the
27810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** chromium sandbox. Opening a directory is a security risk (we are
27811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** told) so making it overrideable allows the chromium sandbox to
27812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** replace this routine with a harmless no-op. To make this routine
27813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a no-op, replace it with a stub that returns SQLITE_OK but leaves
27814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** *pFd set to a negative number.
27815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
27816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If SQLITE_OK is returned, the caller is responsible for closing
27817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the file descriptor *pFd using close().
27818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
27819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int openDirectory(const char *zFilename, int *pFd){
27820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ii;
27821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int fd = -1;
27822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char zDirname[MAX_PATHNAME+1];
27823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
27824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename);
27825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(ii=(int)strlen(zDirname); ii>1 && zDirname[ii]!='/'; ii--);
27826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ii>0 ){
27827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zDirname[ii] = '\0';
27828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0);
27829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fd>=0 ){
27830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef FD_CLOEXEC
27831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC);
27832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
27833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname));
27834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
27835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
27836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pFd = fd;
27837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (fd>=0?SQLITE_OK:unixLogError(SQLITE_CANTOPEN_BKPT, "open", zDirname));
27838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
27670 27839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27671 27840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
27672 27841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Make sure all writes to a particular file are committed to disk.
27673 27842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
27674 27843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If dataOnly==0 then both the file itself and its metadata (file
@@ -27706,32 +27875,25 @@
27706 27875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError( rc=1 );
27707 27876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc ){
27708 27877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = errno;
27709 27878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return unixLogError(SQLITE_IOERR_FSYNC, "full_fsync", pFile->zPath);
27710 27879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->dirfd>=0 ){
27712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE(("DIRSYNC %-3d (have_fullfsync=%d fullsync=%d)\n", pFile->dirfd,
27880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
27881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Also fsync the directory containing the file if the DIRSYNC flag
27882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is set. This is a one-time occurrance. Many systems (examples: AIX)
27883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are unable to fsync a directory, so ignore errors on the fsync.
27884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
27885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pFile->ctrlFlags & UNIXFILE_DIRSYNC ){
27886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int dirfd;
27887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("DIRSYNC %s (have_fullfsync=%d fullsync=%d)\n", pFile->zPath,
27713 27888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
HAVE_FULLFSYNC, isFullsync));
27714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifndef SQLITE_DISABLE_DIRSYNC
27715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* The directory sync is only attempted if full_fsync is
27716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** turned off or unavailable. If a full_fsync occurred above,
27717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** then the directory sync is superfluous.
27718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
27719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (!HAVE_FULLFSYNC || !isFullsync) && full_fsync(pFile->dirfd,0,0) ){
27720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
27721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** We have received multiple reports of fsync() returning
27722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** errors when applied to directories on certain file systems.
27723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** A failed directory sync is not a big deal. So it seems
27724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** better to ignore the error. Ticket #1657
27725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
27726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* pFile->lastErrno = errno; */
27727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* return SQLITE_IOERR; */
27728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
27729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
27730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Only need to sync once, so close the directory when we are done */
27731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- robust_close(pFile, pFile->dirfd, __LINE__);
27732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pFile->dirfd = -1;
27889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = osOpenDirectory(pFile->zPath, &dirfd);
27890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && dirfd>=0 ){
27891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ full_fsync(dirfd, 0, 0);
27892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ robust_close(pFile, dirfd, __LINE__);
27893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
27894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->ctrlFlags &= ~UNIXFILE_DIRSYNC;
27733 27895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27734 27896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
27735 27897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27736 27898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27737 27899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -27816,17 +27978,23 @@
27816 27978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the user has configured a chunk-size for this file, it could be
27817 27979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** that the file needs to be extended at this point. Otherwise, the
27818 27980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SQLITE_FCNTL_SIZE_HINT operation is a no-op for Unix.
27819 27981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
27820 27982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fcntlSizeHint(unixFile *pFile, i64 nByte){
27821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->szChunk ){
27983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { /* preserve indentation of removed "if" */
27822 27984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i64 nSize; /* Required file size */
27985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 szChunk; /* Chunk size */
27823 27986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct stat buf; /* Used to hold return values of fstat() */
27824 27987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27825 27988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( osFstat(pFile->h, &buf) ) return SQLITE_IOERR_FSTAT;
27826 27989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nSize = ((nByte+pFile->szChunk-1) / pFile->szChunk) * pFile->szChunk;
27990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ szChunk = pFile->szChunk;
27991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( szChunk==0 ){
27992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nSize = nByte;
27993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
27994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nSize = ((nByte+szChunk-1) / szChunk) * szChunk;
27995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
27828 27996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nSize>(i64)buf.st_size ){
27829 27997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27830 27998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(HAVE_POSIX_FALLOCATE) && HAVE_POSIX_FALLOCATE
27831 27999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The code below is handling the return value of osFallocate()
27832 28000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** correctly. posix_fallocate() is defined to "returns zero on success,
@@ -27865,25 +28033,37 @@
27865 28033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
27866 28034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
27867 28035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Information and control of an open file handle.
27868 28036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
27869 28037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int unixFileControl(sqlite3_file *id, int op, void *pArg){
28038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ unixFile *pFile = (unixFile*)id;
27870 28039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
switch( op ){
27871 28040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_FCNTL_LOCKSTATE: {
27872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *(int*)pArg = ((unixFile*)id)->eFileLock;
28041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *(int*)pArg = pFile->eFileLock;
27873 28042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
27874 28043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27875 28044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_LAST_ERRNO: {
27876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *(int*)pArg = ((unixFile*)id)->lastErrno;
28045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *(int*)pArg = pFile->lastErrno;
27877 28046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
27878 28047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27879 28048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_FCNTL_CHUNK_SIZE: {
27880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ((unixFile*)id)->szChunk = *(int *)pArg;
28049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->szChunk = *(int *)pArg;
27881 28050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
27882 28051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27883 28052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_FCNTL_SIZE_HINT: {
27884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return fcntlSizeHint((unixFile *)id, *(i64 *)pArg);
28053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return fcntlSizeHint(pFile, *(i64 *)pArg);
28054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
28055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case SQLITE_FCNTL_PERSIST_WAL: {
28056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bPersist = *(int*)pArg;
28057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bPersist<0 ){
28058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *(int*)pArg = (pFile->ctrlFlags & UNIXFILE_PERSIST_WAL)!=0;
28059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( bPersist==0 ){
28060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->ctrlFlags &= ~UNIXFILE_PERSIST_WAL;
28061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
28062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->ctrlFlags |= UNIXFILE_PERSIST_WAL;
28063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
28064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
27885 28065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
27886 28066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef NDEBUG
27887 28067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The pager calls this method to signal that it has done
27888 28068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a rollback and that the database is therefore unchanged and
27889 28069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** it hence it is OK for the transaction change counter to be
@@ -28095,11 +28275,11 @@
28095 28275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixShmNode *p = pFd->pInode->pShmNode;
28096 28276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( unixMutexHeld() );
28097 28277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p && p->nRef==0 ){
28098 28278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
28099 28279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->pInode==pFd->pInode );
28100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->mutex ) sqlite3_mutex_free(p->mutex);
28280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_mutex_free(p->mutex);
28101 28281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<p->nRegion; i++){
28102 28282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->h>=0 ){
28103 28283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
munmap(p->apRegion[i], p->szRegion);
28104 28284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
28105 28285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(p->apRegion[i]);
@@ -28564,11 +28744,11 @@
28564 28744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** shared-memory file, too */
28565 28745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixEnterMutex();
28566 28746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pShmNode->nRef>0 );
28567 28747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pShmNode->nRef--;
28568 28748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pShmNode->nRef==0 ){
28569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( deleteFlag && pShmNode->h>=0 ) unlink(pShmNode->zFilename);
28749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( deleteFlag && pShmNode->h>=0 ) osUnlink(pShmNode->zFilename);
28570 28750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixShmPurge(pDbFd);
28571 28751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
28572 28752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixLeaveMutex();
28573 28753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28574 28754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
@@ -28877,11 +29057,11 @@
28877 29057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Initialize the contents of the unixFile structure pointed to by pId.
28878 29058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
28879 29059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fillInUnixFile(
28880 29060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vfs *pVfs, /* Pointer to vfs object */
28881 29061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int h, /* Open file descriptor of file being opened */
28882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int dirfd, /* Directory file descriptor */
29062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int syncDir, /* True to sync directory on first sync */
28883 29063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_file *pId, /* Write to the unixFile structure here */
28884 29064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFilename, /* Name of the file being opened */
28885 29065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int noLock, /* Omit locking if true */
28886 29066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isDelete, /* Delete on close if true */
28887 29067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isReadOnly /* True if the file is opened read-only */
@@ -28908,20 +29088,22 @@
28908 29088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( zFilename==0 || zFilename[0]=='/' );
28909 29089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
28910 29090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28911 29091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
OSTRACE(("OPEN %-3d %s\n", h, zFilename));
28912 29092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->h = h;
28913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pNew->dirfd = dirfd;
28914 29093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->zPath = zFilename;
28915 29094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( memcmp(pVfs->zName,"unix-excl",10)==0 ){
28916 29095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->ctrlFlags = UNIXFILE_EXCL;
28917 29096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
28918 29097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->ctrlFlags = 0;
28919 29098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
28920 29099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isReadOnly ){
28921 29100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->ctrlFlags |= UNIXFILE_RDONLY;
28922 29101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( syncDir ){
29103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pNew->ctrlFlags |= UNIXFILE_DIRSYNC;
29104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
28923 29105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28924 29106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if OS_VXWORKS
28925 29107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->pId = vxworksFindFileId(zFilename);
28926 29108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pNew->pId==0 ){
28927 29109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
noLock = 1;
@@ -29044,56 +29226,24 @@
29044 29226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->lastErrno = 0;
29045 29227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if OS_VXWORKS
29046 29228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
29047 29229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( h>=0 ) robust_close(pNew, h, __LINE__);
29048 29230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
h = -1;
29049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unlink(zFilename);
29231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ osUnlink(zFilename);
29050 29232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isDelete = 0;
29051 29233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29052 29234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->isDelete = isDelete;
29053 29235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
29054 29236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
29055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( dirfd>=0 ) robust_close(pNew, dirfd, __LINE__);
29056 29237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( h>=0 ) robust_close(pNew, h, __LINE__);
29057 29238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
29058 29239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->pMethod = pLockingStyle;
29059 29240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
OpenCounter(+1);
29060 29241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29061 29242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
29062 29243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29063 29244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
29065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Open a file descriptor to the directory containing file zFilename.
29066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If successful, *pFd is set to the opened file descriptor and
29067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** SQLITE_OK is returned. If an error occurs, either SQLITE_NOMEM
29068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** or SQLITE_CANTOPEN is returned and *pFd is set to an undefined
29069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** value.
29070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
29071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If SQLITE_OK is returned, the caller is responsible for closing
29072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the file descriptor *pFd using close().
29073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
29074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int openDirectory(const char *zFilename, int *pFd){
29075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int ii;
29076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int fd = -1;
29077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char zDirname[MAX_PATHNAME+1];
29078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
29079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_snprintf(MAX_PATHNAME, zDirname, "%s", zFilename);
29080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(ii=(int)strlen(zDirname); ii>1 && zDirname[ii]!='/'; ii--);
29081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ii>0 ){
29082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zDirname[ii] = '\0';
29083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fd = robust_open(zDirname, O_RDONLY|O_BINARY, 0);
29084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( fd>=0 ){
29085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef FD_CLOEXEC
29086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC);
29087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
29088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE(("OPENDIR %-3d %s\n", fd, zDirname));
29089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
29090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
29091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pFd = fd;
29092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return (fd>=0?SQLITE_OK:unixLogError(SQLITE_CANTOPEN_BKPT, "open", zDirname));
29093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
29094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
29095 29245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
29096 29246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return the name of a directory in which to put temporary files.
29097 29247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If no suitable temporary file directory can be found, return NULL.
29098 29248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
29099 29249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const char *unixTempFileDir(void){
@@ -29204,11 +29354,11 @@
29204 29354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ignored and -1 is returned. The caller will try to open a new file
29205 29355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** descriptor on the same path, fail, and return an error to SQLite.
29206 29356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
29207 29357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Even if a subsequent open() call does succeed, the consequences of
29208 29358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** not searching for a resusable file descriptor are not dire. */
29209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( 0==stat(zPath, &sStat) ){
29359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( 0==osStat(zPath, &sStat) ){
29210 29360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixInodeInfo *pInode;
29211 29361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29212 29362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixEnterMutex();
29213 29363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pInode = inodeList;
29214 29364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( pInode && (pInode->fileId.dev!=sStat.st_dev
@@ -29280,11 +29430,11 @@
29280 29430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( nDb>0 && zPath[nDb]!='-' ) nDb--;
29281 29431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nDb==0 ) return SQLITE_OK;
29282 29432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(zDb, zPath, nDb);
29283 29433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zDb[nDb] = '\0';
29284 29434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( 0==stat(zDb, &sStat) ){
29435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( 0==osStat(zDb, &sStat) ){
29286 29436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pMode = sStat.st_mode & 0777;
29287 29437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
29288 29438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_IOERR_FSTAT;
29289 29439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29290 29440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( flags & SQLITE_OPEN_DELETEONCLOSE ){
@@ -29322,11 +29472,10 @@
29322 29472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int flags, /* Input flags to control the opening */
29323 29473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int *pOutFlags /* Output flags returned to SQLite core */
29324 29474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
29325 29475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *p = (unixFile *)pFile;
29326 29476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fd = -1; /* File descriptor returned by open() */
29327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int dirfd = -1; /* Directory file descriptor */
29328 29477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int openFlags = 0; /* Flags to pass to open() */
29329 29478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int eType = flags&0xFFFFFF00; /* Type of file to open */
29330 29479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int noLock; /* True to omit locking primitives */
29331 29480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK; /* Function Return Code */
29332 29481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -29341,11 +29490,11 @@
29341 29490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29342 29491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If creating a master or main-file journal, this function will open
29343 29492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a file-descriptor on the directory too. The first time unixSync()
29344 29493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is called the directory file descriptor will be fsync()ed and close()d.
29345 29494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
29346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int isOpenDirectory = (isCreate && (
29495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int syncDir = (isCreate && (
29347 29496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
eType==SQLITE_OPEN_MASTER_JOURNAL
29348 29497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| eType==SQLITE_OPEN_MAIN_JOURNAL
29349 29498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| eType==SQLITE_OPEN_WAL
29350 29499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
));
29351 29500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -29395,11 +29544,11 @@
29395 29544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29396 29545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29397 29546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pUnused = pUnused;
29398 29547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( !zName ){
29399 29548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If zName is NULL, the upper layer is requesting a temp file. */
29400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert(isDelete && !isOpenDirectory);
29549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert(isDelete && !syncDir);
29401 29550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = unixGetTempname(MAX_PATHNAME+1, zTmpname);
29402 29551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
29403 29552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
29404 29553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29405 29554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zName = zTmpname;
@@ -29451,32 +29600,19 @@
29451 29600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29452 29601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isDelete ){
29453 29602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if OS_VXWORKS
29454 29603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zPath = zName;
29455 29604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
29456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unlink(zName);
29605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ osUnlink(zName);
29457 29606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
29458 29607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29459 29608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_ENABLE_LOCKING_STYLE
29460 29609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
else{
29461 29610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->openFlags = openFlags;
29462 29611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29463 29612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
29464 29613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( isOpenDirectory ){
29466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = openDirectory(zPath, &dirfd);
29467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ){
29468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* It is safe to close fd at this point, because it is guaranteed not
29469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** to be open on a database file. If it were open on a database file,
29470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** it would not be safe to close as this would release any locks held
29471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** on the file by this process. */
29472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( eType!=SQLITE_OPEN_MAIN_DB );
29473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- robust_close(p, fd, __LINE__);
29474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto open_finished;
29475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
29476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
29477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
29478 29614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef FD_CLOEXEC
29479 29615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
osFcntl(fd, F_SETFD, osFcntl(fd, F_GETFD, 0) | FD_CLOEXEC);
29480 29616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
29481 29617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29482 29618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
noLock = eType!=SQLITE_OPEN_MAIN_DB;
@@ -29484,11 +29620,10 @@
29484 29620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29485 29621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(__APPLE__) || SQLITE_ENABLE_LOCKING_STYLE
29486 29622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct statfs fsInfo;
29487 29623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fstatfs(fd, &fsInfo) == -1 ){
29488 29624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
((unixFile*)pFile)->lastErrno = errno;
29489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( dirfd>=0 ) robust_close(p, dirfd, __LINE__);
29490 29625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
robust_close(p, fd, __LINE__);
29491 29626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_IOERR_ACCESS;
29492 29627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29493 29628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if (0 == strncmp("msdos", fsInfo.f_fstypename, 5)) {
29494 29629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
((unixFile*)pFile)->fsFlags |= SQLITE_FSFLAGS_IS_MSDOS;
@@ -29516,21 +29651,18 @@
29516 29651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** then the call to close() will cancel those locks. In practice,
29517 29652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** we're assuming that statfs() doesn't fail very often. At least
29518 29653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** not while other file descriptors opened by the same process on
29519 29654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the same file are working. */
29520 29655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->lastErrno = errno;
29521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( dirfd>=0 ){
29522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- robust_close(p, dirfd, __LINE__);
29523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
29524 29656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
robust_close(p, fd, __LINE__);
29525 29657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_IOERR_ACCESS;
29526 29658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto open_finished;
29527 29659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29528 29660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
useProxy = !(fsInfo.f_flags&MNT_LOCAL);
29529 29661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29530 29662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( useProxy ){
29531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fillInUnixFile(pVfs, fd, dirfd, pFile, zPath, noLock,
29663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fillInUnixFile(pVfs, fd, syncDir, pFile, zPath, noLock,
29532 29664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isDelete, isReadonly);
29533 29665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
29534 29666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = proxyTransformUnixFile((unixFile*)pFile, ":auto:");
29535 29667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
29536 29668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Use unixClose to clean up the resources added in fillInUnixFile
@@ -29544,11 +29676,11 @@
29544 29676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto open_finished;
29545 29677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29546 29678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29547 29679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
29548 29680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
29549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fillInUnixFile(pVfs, fd, dirfd, pFile, zPath, noLock,
29681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fillInUnixFile(pVfs, fd, syncDir, pFile, zPath, noLock,
29550 29682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isDelete, isReadonly);
29551 29683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
open_finished:
29552 29684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
29553 29685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(p->pUnused);
29554 29686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -29566,17 +29698,17 @@
29566 29698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int dirSync /* If true, fsync() directory after deleting file */
29567 29699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
29568 29700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
29569 29701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(NotUsed);
29570 29702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError(return SQLITE_IOERR_DELETE);
29571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( unlink(zPath)==(-1) && errno!=ENOENT ){
29703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( osUnlink(zPath)==(-1) && errno!=ENOENT ){
29572 29704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return unixLogError(SQLITE_IOERR_DELETE, "unlink", zPath);
29573 29705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29574 29706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_DISABLE_DIRSYNC
29575 29707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( dirSync ){
29576 29708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fd;
29577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = openDirectory(zPath, &fd);
29709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = osOpenDirectory(zPath, &fd);
29578 29710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
29579 29711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if OS_VXWORKS
29580 29712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fsync(fd)==-1 )
29581 29713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
29582 29714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fsync(fd) )
@@ -29625,11 +29757,11 @@
29625 29757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert(!"Invalid flags argument");
29626 29758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29627 29759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pResOut = (osAccess(zPath, amode)==0);
29628 29760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( flags==SQLITE_ACCESS_EXISTS && *pResOut ){
29629 29761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct stat buf;
29630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( 0==stat(zPath, &buf) && buf.st_size==0 ){
29762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( 0==osStat(zPath, &buf) && buf.st_size==0 ){
29631 29763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pResOut = 0;
29632 29764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29633 29765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
29634 29766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
29635 29767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -30144,11 +30276,10 @@
30144 30276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *path, /* path for the new unixFile */
30145 30277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile **ppFile, /* unixFile created and returned by ref */
30146 30278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int islockfile /* if non zero missing dirs will be created */
30147 30279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
) {
30148 30280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int fd = -1;
30149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int dirfd = -1;
30150 30281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unixFile *pNew;
30151 30282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
30152 30283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int openFlags = O_RDWR | O_CREAT;
30153 30284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vfs dummyVfs;
30154 30285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int terrno = 0;
@@ -30209,11 +30340,11 @@
30209 30340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dummyVfs.zName = "dummy";
30210 30341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pUnused->fd = fd;
30211 30342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pUnused->flags = openFlags;
30212 30343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNew->pUnused = pUnused;
30213 30344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
30214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fillInUnixFile(&dummyVfs, fd, dirfd, (sqlite3_file*)pNew, path, 0, 0, 0);
30345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fillInUnixFile(&dummyVfs, fd, 0, (sqlite3_file*)pNew, path, 0, 0, 0);
30215 30346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
30216 30347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*ppFile = pNew;
30217 30348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
30218 30349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
30219 30350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
end_create_proxy:
@@ -30323,11 +30454,11 @@
30323 30454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
conchFile->openFlags = O_RDWR | O_CREAT;
30324 30455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
30325 30456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
end_breaklock:
30326 30457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc ){
30327 30458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fd>=0 ){
30328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unlink(tPath);
30459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ osUnlink(tPath);
30329 30460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
robust_close(pFile, fd, __LINE__);
30330 30461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
30331 30462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fprintf(stderr, "failed to break stale lock on %s, %s\n", cPath, errmsg);
30332 30463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
30333 30464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
@@ -31146,11 +31277,11 @@
31146 31277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
31147 31278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
unsigned int i; /* Loop counter */
31148 31279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
31149 31280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Double-check that the aSyscall[] array has been constructed
31150 31281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** correctly. See ticket [bb3a86e890c8e96ab] */
31151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( ArraySize(aSyscall)==16 );
31282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( ArraySize(aSyscall)==18 );
31152 31283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
31153 31284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Register all VFSes defined in the aVfs[] array */
31154 31285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<(sizeof(aVfs)/sizeof(sqlite3_vfs)); i++){
31155 31286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vfs_register(&aVfs[i], i==0);
31156 31287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -31263,14 +31394,17 @@
31263 31394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef MEMORY_DEBUG
31264 31395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# error "The MEMORY_DEBUG macro is obsolete. Use SQLITE_DEBUG instead."
31265 31396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
31266 31397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
31267 31398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
31268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3OSTrace = 0;
31269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X
31399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # ifndef SQLITE_DEBUG_OS_TRACE
31400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define SQLITE_DEBUG_OS_TRACE 0
31401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # endif
31402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int sqlite3OSTrace = SQLITE_DEBUG_OS_TRACE;
31403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define OSTRACE(X) if( sqlite3OSTrace ) sqlite3DebugPrintf X
31270 31404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
31271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define OSTRACE(X)
31405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define OSTRACE(X)
31272 31406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
31273 31407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
31274 31408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
31275 31409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Macros for performance tracing. Normally turned off. Only works
31276 31410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** on i486 hardware.
@@ -31478,12 +31612,13 @@
31478 31612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct winFile winFile;
31479 31613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct winFile {
31480 31614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const sqlite3_io_methods *pMethod; /*** Must be first ***/
31481 31615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vfs *pVfs; /* The VFS used to open this file */
31482 31616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
HANDLE h; /* Handle for accessing the file */
31483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned char locktype; /* Type of lock currently held on this file */
31617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 locktype; /* Type of lock currently held on this file */
31484 31618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
short sharedLockByte; /* Randomly chosen byte used as a shared lock */
31619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 bPersistWal; /* True to persist WAL files */
31485 31620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DWORD lastErrno; /* The Windows errno from the last I/O error */
31486 31621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DWORD sectorSize; /* Sector size of the device file is on */
31487 31622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winShm *pShm; /* Instance of shared memory on this file */
31488 31623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zPath; /* Full pathname of this file */
31489 31624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int szChunk; /* Chunk size configured by FCNTL_CHUNK_SIZE */
@@ -31777,10 +31912,58 @@
31777 31912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iLine, iErrno, zFunc, zPath, zMsg
31778 31913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
31779 31914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
31780 31915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return errcode;
31781 31916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
31917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
31918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
31919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The number of times that a ReadFile(), WriteFile(), and DeleteFile()
31920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** will be retried following a locking error - probably caused by
31921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** antivirus software. Also the initial delay before the first retry.
31922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The delay increases linearly with each retry.
31923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
31924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_WIN32_IOERR_RETRY
31925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define SQLITE_WIN32_IOERR_RETRY 10
31926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
31927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_WIN32_IOERR_RETRY_DELAY
31928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define SQLITE_WIN32_IOERR_RETRY_DELAY 25
31929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
31930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int win32IoerrRetry = SQLITE_WIN32_IOERR_RETRY;
31931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int win32IoerrRetryDelay = SQLITE_WIN32_IOERR_RETRY_DELAY;
31932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
31933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
31934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If a ReadFile() or WriteFile() error occurs, invoke this routine
31935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to see if it should be retried. Return TRUE to retry. Return FALSE
31936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to give up with an error.
31937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
31938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int retryIoerr(int *pnRetry){
31939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DWORD e;
31940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *pnRetry>=win32IoerrRetry ){
31941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
31942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
31943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e = GetLastError();
31944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( e==ERROR_ACCESS_DENIED ||
31945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e==ERROR_LOCK_VIOLATION ||
31946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ e==ERROR_SHARING_VIOLATION ){
31947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Sleep(win32IoerrRetryDelay*(1+*pnRetry));
31948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ++*pnRetry;
31949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
31950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
31951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
31952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
31953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
31954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
31955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Log a I/O error retry episode.
31956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
31957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void logIoerr(int nRetry){
31958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nRetry ){
31959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_log(SQLITE_IOERR,
31960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "delayed %dms for lock/sharing conflict",
31961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ win32IoerrRetryDelay*nRetry*(nRetry+1)/2
31962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
31963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
31964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
31782 31965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
31783 31966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_OS_WINCE
31784 31967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*************************************************************************
31785 31968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This section contains code for WinCE only.
31786 31969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -32195,22 +32378,25 @@
32195 32378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int amt, /* Number of bytes to read */
32196 32379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 offset /* Begin reading at this offset */
32197 32380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
32198 32381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winFile *pFile = (winFile*)id; /* file handle */
32199 32382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DWORD nRead; /* Number of bytes actually read from file */
32383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRetry = 0; /* Number of retrys */
32200 32384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32201 32385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( id!=0 );
32202 32386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError(return SQLITE_IOERR_READ);
32203 32387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
OSTRACE(("READ %d lock=%d\n", pFile->h, pFile->locktype));
32204 32388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32205 32389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( seekWinFile(pFile, offset) ){
32206 32390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_FULL;
32207 32391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !ReadFile(pFile->h, pBuf, amt, &nRead, 0) ){
32392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( !ReadFile(pFile->h, pBuf, amt, &nRead, 0) ){
32393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( retryIoerr(&nRetry) ) continue;
32209 32394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = GetLastError();
32210 32395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return winLogError(SQLITE_IOERR_READ, "winRead", pFile->zPath);
32211 32396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ logIoerr(nRetry);
32212 32398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nRead<(DWORD)amt ){
32213 32399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Unread parts of the buffer must be zero-filled */
32214 32400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&((char*)pBuf)[nRead], 0, amt-nRead);
32215 32401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_IOERR_SHORT_READ;
32216 32402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -32228,10 +32414,11 @@
32228 32414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int amt, /* Number of bytes to write */
32229 32415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 offset /* Offset into the file to begin writing at */
32230 32416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
32231 32417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc; /* True if error has occured, else false */
32232 32418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winFile *pFile = (winFile*)id; /* File handle */
32419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRetry = 0; /* Number of retries */
32233 32420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32234 32421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( amt>0 );
32235 32422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pFile );
32236 32423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError(return SQLITE_IOERR_WRITE);
32237 32424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateDiskfullError(return SQLITE_FULL);
@@ -32242,11 +32429,16 @@
32242 32429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==0 ){
32243 32430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 *aRem = (u8 *)pBuf; /* Data yet to be written */
32244 32431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nRem = amt; /* Number of bytes yet to be written */
32245 32432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
DWORD nWrite; /* Bytes written by each WriteFile() call */
32246 32433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( nRem>0 && WriteFile(pFile->h, aRem, nRem, &nWrite, 0) && nWrite>0 ){
32434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( nRem>0 ){
32435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !WriteFile(pFile->h, aRem, nRem, &nWrite, 0) ){
32436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( retryIoerr(&nRetry) ) continue;
32437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
32438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
32439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nWrite<=0 ) break;
32248 32440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aRem += nWrite;
32249 32441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nRem -= nWrite;
32250 32442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32251 32443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nRem>0 ){
32252 32444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pFile->lastErrno = GetLastError();
@@ -32253,14 +32445,17 @@
32253 32445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = 1;
32254 32446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32255 32447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32256 32448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32257 32449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc ){
32258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pFile->lastErrno==ERROR_HANDLE_DISK_FULL ){
32450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ( pFile->lastErrno==ERROR_HANDLE_DISK_FULL )
32451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || ( pFile->lastErrno==ERROR_DISK_FULL )){
32259 32452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_FULL;
32260 32453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32261 32454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return winLogError(SQLITE_IOERR_WRITE, "winWrite", pFile->zPath);
32455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
32456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ logIoerr(nRetry);
32262 32457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32263 32458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
32264 32459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32265 32460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32266 32461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -32650,32 +32845,56 @@
32650 32845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
32651 32846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
32652 32847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Control and query of the open file handle.
32653 32848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
32654 32849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int winFileControl(sqlite3_file *id, int op, void *pArg){
32850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ winFile *pFile = (winFile*)id;
32655 32851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
switch( op ){
32656 32852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_FCNTL_LOCKSTATE: {
32657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *(int*)pArg = ((winFile*)id)->locktype;
32853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *(int*)pArg = pFile->locktype;
32658 32854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
32659 32855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32660 32856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_LAST_ERRNO: {
32661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *(int*)pArg = (int)((winFile*)id)->lastErrno;
32857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *(int*)pArg = (int)pFile->lastErrno;
32662 32858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
32663 32859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32664 32860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_FCNTL_CHUNK_SIZE: {
32665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ((winFile*)id)->szChunk = *(int *)pArg;
32861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->szChunk = *(int *)pArg;
32666 32862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
32667 32863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32668 32864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_FCNTL_SIZE_HINT: {
32669 32865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 sz = *(sqlite3_int64*)pArg;
32670 32866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOErrorBenign(1);
32671 32867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winTruncate(id, sz);
32672 32868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOErrorBenign(0);
32673 32869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
32870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
32871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case SQLITE_FCNTL_PERSIST_WAL: {
32872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bPersist = *(int*)pArg;
32873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bPersist<0 ){
32874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *(int*)pArg = pFile->bPersistWal;
32875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
32876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pFile->bPersistWal = bPersist!=0;
32877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
32878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
32674 32879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32675 32880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_FCNTL_SYNC_OMITTED: {
32676 32881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
32882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
32883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case SQLITE_FCNTL_WIN32_AV_RETRY: {
32884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *a = (int*)pArg;
32885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( a[0]>0 ){
32886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ win32IoerrRetry = a[0];
32887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
32888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a[0] = win32IoerrRetry;
32889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
32890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( a[1]>0 ){
32891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ win32IoerrRetryDelay = a[1];
32892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
32893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a[1] = win32IoerrRetryDelay;
32894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
32895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
32677 32896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32678 32897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32679 32898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_NOTFOUND;
32680 32899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
32681 32900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -33481,10 +33700,11 @@
33481 33700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isTemp = 0;
33482 33701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
33483 33702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winFile *pFile = (winFile*)id;
33484 33703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *zConverted; /* Filename in OS encoding */
33485 33704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zUtf8Name = zName; /* Filename in UTF-8 encoding */
33705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int cnt = 0;
33486 33706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33487 33707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If argument zPath is a NULL pointer, this function is required to open
33488 33708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a temporary file. Use this buffer to store the file name in.
33489 33709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
33490 33710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char zTmpname[MAX_PATH+1]; /* Buffer used to create temp filename */
@@ -33600,34 +33820,34 @@
33600 33820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_OS_WINCE
33601 33821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
dwFlagsAndAttributes |= FILE_FLAG_RANDOM_ACCESS;
33602 33822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
33603 33823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33604 33824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isNT() ){
33605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- h = CreateFileW((WCHAR*)zConverted,
33606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- dwDesiredAccess,
33607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- dwShareMode,
33608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- NULL,
33609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- dwCreationDisposition,
33610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- dwFlagsAndAttributes,
33611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- NULL
33612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
33825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( (h = CreateFileW((WCHAR*)zConverted,
33826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dwDesiredAccess,
33827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dwShareMode, NULL,
33828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dwCreationDisposition,
33829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dwFlagsAndAttributes,
33830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ NULL))==INVALID_HANDLE_VALUE &&
33831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ retryIoerr(&cnt) ){}
33613 33832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed.
33614 33833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Since the ASCII version of these Windows API do not exist for WINCE,
33615 33834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** it's important to not reference them for WINCE builds.
33616 33835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
33617 33836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_OS_WINCE==0
33618 33837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
33619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- h = CreateFileA((char*)zConverted,
33620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- dwDesiredAccess,
33621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- dwShareMode,
33622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- NULL,
33623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- dwCreationDisposition,
33624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- dwFlagsAndAttributes,
33625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- NULL
33626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
33838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( (h = CreateFileA((char*)zConverted,
33839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dwDesiredAccess,
33840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dwShareMode, NULL,
33841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dwCreationDisposition,
33842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ dwFlagsAndAttributes,
33843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ NULL))==INVALID_HANDLE_VALUE &&
33844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ retryIoerr(&cnt) ){}
33627 33845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
33628 33846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
33848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ logIoerr(cnt);
33629 33849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33630 33850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
OSTRACE(("OPEN %d %s 0x%lx %s\n",
33631 33851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
h, zName, dwDesiredAccess,
33632 33852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
h==INVALID_HANDLE_VALUE ? "failed" : "ok"));
33633 33853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -33690,19 +33910,17 @@
33690 33910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** file open, we will be unable to delete it. To work around this
33691 33911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** problem, we delay 100 milliseconds and try to delete again. Up
33692 33912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to MX_DELETION_ATTEMPTs deletion attempts are run before giving
33693 33913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** up and returning an error.
33694 33914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
33695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define MX_DELETION_ATTEMPTS 5
33696 33915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int winDelete(
33697 33916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vfs *pVfs, /* Not used on win32 */
33698 33917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zFilename, /* Name of file to delete */
33699 33918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int syncDir /* Not used on win32 */
33700 33919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
33701 33920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int cnt = 0;
33702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DWORD rc;
33703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DWORD error = 0;
33921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
33704 33922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *zConverted;
33705 33923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(pVfs);
33706 33924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(syncDir);
33707 33925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33708 33926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SimulateIOError(return SQLITE_IOERR_DELETE);
@@ -33709,38 +33927,34 @@
33709 33927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zConverted = convertUtf8Filename(zFilename);
33710 33928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zConverted==0 ){
33711 33929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_NOMEM;
33712 33930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33713 33931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isNT() ){
33714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- do{
33715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DeleteFileW(zConverted);
33716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }while( ( ((rc = GetFileAttributesW(zConverted)) != INVALID_FILE_ATTRIBUTES)
33717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || ((error = GetLastError()) == ERROR_ACCESS_DENIED))
33718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && (++cnt < MX_DELETION_ATTEMPTS)
33719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && (Sleep(100), 1) );
33932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = 1;
33933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( GetFileAttributesW(zConverted)!=INVALID_FILE_ATTRIBUTES &&
33934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (rc = DeleteFileW(zConverted))==0 && retryIoerr(&cnt) ){}
33935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = rc ? SQLITE_OK : SQLITE_ERROR;
33720 33936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* isNT() is 1 if SQLITE_OS_WINCE==1, so this else is never executed.
33721 33937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Since the ASCII version of these Windows API do not exist for WINCE,
33722 33938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** it's important to not reference them for WINCE builds.
33723 33939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
33724 33940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if SQLITE_OS_WINCE==0
33725 33941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
33726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- do{
33727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DeleteFileA(zConverted);
33728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }while( ( ((rc = GetFileAttributesA(zConverted)) != INVALID_FILE_ATTRIBUTES)
33729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || ((error = GetLastError()) == ERROR_ACCESS_DENIED))
33730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && (++cnt < MX_DELETION_ATTEMPTS)
33731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && (Sleep(100), 1) );
33942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = 1;
33943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( GetFileAttributesA(zConverted)!=INVALID_FILE_ATTRIBUTES &&
33944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (rc = DeleteFileA(zConverted))==0 && retryIoerr(&cnt) ){}
33945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = rc ? SQLITE_OK : SQLITE_ERROR;
33732 33946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
33733 33947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ){
33949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = winLogError(SQLITE_IOERR_DELETE, "winDelete", zFilename);
33950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
33951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ logIoerr(cnt);
33952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
33734 33953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(zConverted);
33735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- OSTRACE(("DELETE \"%s\" %s\n", zFilename,
33736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ( (rc==INVALID_FILE_ATTRIBUTES) && (error==ERROR_FILE_NOT_FOUND)) ?
33737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "ok" : "failed" ));
33738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
33739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return ( (rc == INVALID_FILE_ATTRIBUTES)
33740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && (error == ERROR_FILE_NOT_FOUND)) ? SQLITE_OK :
33741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- winLogError(SQLITE_IOERR_DELETE, "winDelete", zFilename);
33954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ OSTRACE(("DELETE \"%s\" %s\n", zFilename, (rc ? "failed" : "ok" )));
33955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
33742 33956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33743 33957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
33744 33958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
33745 33959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Check the existance and status of a file.
33746 33960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -33759,15 +33973,17 @@
33759 33973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zConverted = convertUtf8Filename(zFilename);
33760 33974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zConverted==0 ){
33761 33975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_NOMEM;
33762 33976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33763 33977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isNT() ){
33978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int cnt = 0;
33764 33979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WIN32_FILE_ATTRIBUTE_DATA sAttrData;
33765 33980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&sAttrData, 0, sizeof(sAttrData));
33766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( GetFileAttributesExW((WCHAR*)zConverted,
33981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( !(rc = GetFileAttributesExW((WCHAR*)zConverted,
33767 33982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
GetFileExInfoStandard,
33768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- &sAttrData) ){
33983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ &sAttrData)) && retryIoerr(&cnt) ){}
33984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ){
33769 33985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* For an SQLITE_ACCESS_EXISTS query, treat a zero-length file
33770 33986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** as if it does not exist.
33771 33987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
33772 33988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( flags==SQLITE_ACCESS_EXISTS
33773 33989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& sAttrData.nFileSizeHigh==0
@@ -33775,10 +33991,11 @@
33775 33991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
attr = INVALID_FILE_ATTRIBUTES;
33776 33992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
33777 33993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
attr = sAttrData.dwFileAttributes;
33778 33994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33779 33995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
33996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ logIoerr(cnt);
33780 33997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( GetLastError()!=ERROR_FILE_NOT_FOUND ){
33781 33998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
winLogError(SQLITE_IOERR_ACCESS, "winAccess", zFilename);
33782 33999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
free(zConverted);
33783 34000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_IOERR_ACCESS;
33784 34001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
@@ -33799,11 +34016,12 @@
33799 34016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_ACCESS_READ:
33800 34017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_ACCESS_EXISTS:
33801 34018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = attr!=INVALID_FILE_ATTRIBUTES;
33802 34019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
33803 34020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case SQLITE_ACCESS_READWRITE:
33804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = (attr & FILE_ATTRIBUTE_READONLY)==0;
34021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = attr!=INVALID_FILE_ATTRIBUTES &&
34022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (attr & FILE_ATTRIBUTE_READONLY)==0;
33805 34023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
33806 34024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
default:
33807 34025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert(!"Invalid flags argument");
33808 34026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33809 34027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pResOut = rc;
@@ -35805,11 +36023,11 @@
35805 36023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(pCache, 0, sz);
35806 36024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( separateCache ){
35807 36025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pGroup = (PGroup*)&pCache[1];
35808 36026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pGroup->mxPinned = 10;
35809 36027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
35810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pGroup = &pcache1_g.grp;
36028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pGroup = &pcache1.grp;
35811 36029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
35812 36030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCache->pGroup = pGroup;
35813 36031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCache->szPage = szPage;
35814 36032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCache->bPurgeable = (bPurgeable ? 1 : 0);
35815 36033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( bPurgeable ){
@@ -45383,17 +45601,19 @@
45383 45601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
45384 45602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The EXCLUSIVE lock is not released before returning.
45385 45603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
45386 45604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3OsLock(pWal->pDbFd, SQLITE_LOCK_EXCLUSIVE);
45387 45605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
45606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bPersistWal = -1;
45388 45607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pWal->exclusiveMode==WAL_NORMAL_MODE ){
45389 45608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pWal->exclusiveMode = WAL_EXCLUSIVE_MODE;
45390 45609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
45391 45610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3WalCheckpoint(
45392 45611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pWal, SQLITE_CHECKPOINT_PASSIVE, 0, 0, sync_flags, nBuf, zBuf, 0, 0
45393 45612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
45394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
45613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OsFileControl(pWal->pDbFd, SQLITE_FCNTL_PERSIST_WAL, &bPersistWal);
45614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && bPersistWal!=1 ){
45395 45615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isDelete = 1;
45396 45616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
45397 45617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
45398 45618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
45399 45619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
walIndexClose(pWal, isDelete);
@@ -48324,10 +48544,12 @@
48324 48544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
48325 48545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine works only for pages that do not contain overflow cells.
48326 48546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
48327 48547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define findCell(P,I) \
48328 48548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
((P)->aData + ((P)->maskPage & get2byte(&(P)->aData[(P)->cellOffset+2*(I)])))
48549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define findCellv2(D,M,O,I) (D+(M&get2byte(D+(O+2*(I)))))
48550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
48329 48551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
48330 48552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
48331 48553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This a more complex version of findCell() that works for
48332 48554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** pages that do contain overflow cells.
48333 48555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -51918,11 +52140,11 @@
51918 52140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pCur->apPage[pCur->iPage]->nCell==0 );
51919 52141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
51920 52142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
51921 52143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pCur->apPage[0]->intKey || pIdxKey );
51922 52144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(;;){
51923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int lwr, upr;
52145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int lwr, upr, idx;
51924 52146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Pgno chldPg;
51925 52147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
MemPage *pPage = pCur->apPage[pCur->iPage];
51926 52148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int c;
51927 52149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
51928 52150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* pPage->nCell must be greater than zero. If this is the root-page
@@ -51934,18 +52156,18 @@
51934 52156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPage->nCell>0 );
51935 52157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPage->intKey==(pIdxKey==0) );
51936 52158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lwr = 0;
51937 52159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
upr = pPage->nCell-1;
51938 52160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( biasRight ){
51939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCur->aiIdx[pCur->iPage] = (u16)upr;
52161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCur->aiIdx[pCur->iPage] = (u16)(idx = upr);
51940 52162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
51941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCur->aiIdx[pCur->iPage] = (u16)((upr+lwr)/2);
52163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCur->aiIdx[pCur->iPage] = (u16)(idx = (upr+lwr)/2);
51942 52164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
51943 52165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(;;){
51944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int idx = pCur->aiIdx[pCur->iPage]; /* Index of current cell in pPage */
51945 52166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 *pCell; /* Pointer to current cell in pPage */
51946 52167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
52168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( idx==pCur->aiIdx[pCur->iPage] );
51947 52169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCur->info.nSize = 0;
51948 52170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCell = findCell(pPage, idx) + pPage->childPtrSize;
51949 52171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPage->intKey ){
51950 52172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
i64 nCellKey;
51951 52173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPage->hasData ){
@@ -52024,11 +52246,11 @@
52024 52246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
upr = idx-1;
52025 52247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
52026 52248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( lwr>upr ){
52027 52249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
52028 52250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
52029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCur->aiIdx[pCur->iPage] = (u16)((lwr+upr)/2);
52251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCur->aiIdx[pCur->iPage] = (u16)(idx = (lwr+upr)/2);
52030 52252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
52031 52253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( lwr==upr+1 );
52032 52254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pPage->isInit );
52033 52255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPage->leaf ){
52034 52256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
chldPg = 0;
@@ -52886,13 +53108,13 @@
52886 53108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc ){
52887 53109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pRC = rc;
52888 53110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
52889 53111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
52890 53112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
endPtr = &data[pPage->cellOffset + 2*pPage->nCell - 2];
53113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (SQLITE_PTR_TO_INT(ptr)&1)==0 ); /* ptr is always 2-byte aligned */
52891 53114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( ptr<endPtr ){
52892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ptr[0] = ptr[2];
52893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ptr[1] = ptr[3];
53115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *(u16*)ptr = *(u16*)&ptr[2];
52894 53116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ptr += 2;
52895 53117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
52896 53118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPage->nCell--;
52897 53119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
put2byte(&data[hdr+3], pPage->nCell);
52898 53120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPage->nFree += 2;
@@ -52929,10 +53151,11 @@
52929 53151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int end; /* First byte past the last cell pointer in data[] */
52930 53152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int ins; /* Index in data[] where new cell pointer is inserted */
52931 53153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int cellOffset; /* Address of first cell pointer in data[] */
52932 53154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 *data; /* The content of the whole page */
52933 53155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 *ptr; /* Used for moving information around in data[] */
53156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *endPtr; /* End of the loop */
52934 53157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
52935 53158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nSkip = (iChild ? 4 : 0);
52936 53159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
52937 53160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( *pRC ) return;
52938 53161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -52979,13 +53202,16 @@
52979 53202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPage->nFree -= (u16)(2 + sz);
52980 53203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(&data[idx+nSkip], pCell+nSkip, sz-nSkip);
52981 53204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iChild ){
52982 53205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
put4byte(&data[idx], iChild);
52983 53206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
52984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(j=end, ptr=&data[j]; j>ins; j-=2, ptr-=2){
52985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ptr[0] = ptr[-2];
52986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ptr[1] = ptr[-1];
53207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ptr = &data[end];
53208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ endPtr = &data[ins];
53209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (SQLITE_PTR_TO_INT(ptr)&1)==0 ); /* ptr is always 2-byte aligned */
53210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( ptr>endPtr ){
53211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *(u16*)ptr = *(u16*)&ptr[-2];
53212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ptr -= 2;
52987 53213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
52988 53214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
put2byte(&data[ins], idx);
52989 53215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
put2byte(&data[pPage->hdrOffset+3], pPage->nCell);
52990 53216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_AUTOVACUUM
52991 53217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pPage->pBt->autoVacuum ){
@@ -53026,14 +53252,15 @@
53026 53252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( get2byteNotZero(&data[hdr+5])==nUsable );
53027 53253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
53028 53254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCellptr = &data[pPage->cellOffset + nCell*2];
53029 53255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cellbody = nUsable;
53030 53256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=nCell-1; i>=0; i--){
53257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u16 sz = aSize[i];
53031 53258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCellptr -= 2;
53032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- cellbody -= aSize[i];
53259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cellbody -= sz;
53033 53260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
put2byte(pCellptr, cellbody);
53034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memcpy(&data[cellbody], apCell[i], aSize[i]);
53261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(&data[cellbody], apCell[i], sz);
53035 53262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
53036 53263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
put2byte(&data[hdr+3], nCell);
53037 53264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
put2byte(&data[hdr+5], cellbody);
53038 53265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPage->nFree -= (nCell*2 + nUsable - cellbody);
53039 53266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPage->nCell = (u16)nCell;
@@ -53483,16 +53710,28 @@
53483 53710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(pOld, apOld[i], sizeof(MemPage));
53484 53711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pOld->aData = (void*)&pOld[1];
53485 53712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(pOld->aData, apOld[i]->aData, pBt->pageSize);
53486 53713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
53487 53714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
limit = pOld->nCell+pOld->nOverflow;
53488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(j=0; j<limit; j++){
53489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( nCell<nMaxCells );
53490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- apCell[nCell] = findOverflowCell(pOld, j);
53491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- szCell[nCell] = cellSizePtr(pOld, apCell[nCell]);
53492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nCell++;
53493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
53715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pOld->nOverflow>0 ){
53716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; j<limit; j++){
53717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( nCell<nMaxCells );
53718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ apCell[nCell] = findOverflowCell(pOld, j);
53719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ szCell[nCell] = cellSizePtr(pOld, apCell[nCell]);
53720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCell++;
53721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
53722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
53723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *aData = pOld->aData;
53724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u16 maskPage = pOld->maskPage;
53725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u16 cellOffset = pOld->cellOffset;
53726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; j<limit; j++){
53727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( nCell<nMaxCells );
53728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ apCell[nCell] = findCellv2(aData, maskPage, cellOffset, j);
53729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ szCell[nCell] = cellSizePtr(pOld, apCell[nCell]);
53730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCell++;
53731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
53732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
53494 53733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( i<nOld-1 && !leafData){
53495 53734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u16 sz = (u16)szNew[i];
53496 53735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 *pTemp;
53497 53736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( nCell<nMaxCells );
53498 53737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
szCell[nCell] = sz;
@@ -57353,15 +57592,15 @@
57353 57592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*ppVal = 0;
57354 57593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
57355 57594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
57356 57595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
op = pExpr->op;
57357 57596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
57358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* op can only be TK_REGISTER if we have compiled with SQLITE_ENABLE_STAT2.
57597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* op can only be TK_REGISTER if we have compiled with SQLITE_ENABLE_STAT3.
57359 57598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The ifdef here is to enable us to achieve 100% branch test coverage even
57360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** when SQLITE_ENABLE_STAT2 is omitted.
57599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** when SQLITE_ENABLE_STAT3 is omitted.
57361 57600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
57362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
57601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
57363 57602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( op==TK_REGISTER ) op = pExpr->op2;
57364 57603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
57365 57604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( NEVER(op==TK_REGISTER) ) op = pExpr->op2;
57366 57605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
57367 57606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -57637,17 +57876,10 @@
57637 57876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pOp->p1 = p1;
57638 57877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pOp->p2 = p2;
57639 57878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pOp->p3 = p3;
57640 57879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pOp->p4.p = 0;
57641 57880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pOp->p4type = P4_NOTUSED;
57642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->expired = 0;
57643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( op==OP_ParseSchema ){
57644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Any program that uses the OP_ParseSchema opcode needs to lock
57645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** all btrees. */
57646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int j;
57647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(j=0; j<p->db->nDb; j++) sqlite3VdbeUsesBtree(p, j);
57648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
57649 57881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_DEBUG
57650 57882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pOp->zComment = 0;
57651 57883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3VdbeAddopTrace ) sqlite3VdbePrintOp(0, i, &p->aOp[i]);
57652 57884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
57653 57885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef VDBE_PROFILE
@@ -57681,10 +57913,24 @@
57681 57913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
57682 57914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int addr = sqlite3VdbeAddOp3(p, op, p1, p2, p3);
57683 57915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeChangeP4(p, addr, zP4, p4type);
57684 57916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return addr;
57685 57917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
57918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
57919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
57920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Add an OP_ParseSchema opcode. This routine is broken out from
57921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3VdbeAddOp4() since it needs to also local all btrees.
57922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
57923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The zWhere string must have been obtained from sqlite3_malloc().
57924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine will take ownership of the allocated memory.
57925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
57926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3VdbeAddParseSchemaOp(Vdbe *p, int iDb, char *zWhere){
57927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int j;
57928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int addr = sqlite3VdbeAddOp3(p, OP_ParseSchema, iDb, 0, 0);
57929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP4(p, addr, zWhere, P4_DYNAMIC);
57930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; j<p->db->nDb; j++) sqlite3VdbeUsesBtree(p, j);
57931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
57686 57932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
57687 57933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
57688 57934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Add an opcode that includes the p4 value as an integer.
57689 57935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
57690 57936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3VdbeAddOp4Int(
@@ -58046,12 +58292,12 @@
58046 58292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
58047 58293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Change the P2 operand of instruction addr so that it points to
58048 58294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the address of the next instruction to be coded.
58049 58295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
58050 58296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3VdbeJumpHere(Vdbe *p, int addr){
58051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( addr>=0 );
58052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeChangeP2(p, addr, p->nOp);
58297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( addr>=0 || p->db->mallocFailed );
58298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( addr>=0 ) sqlite3VdbeChangeP2(p, addr, p->nOp);
58053 58299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
58054 58300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
58055 58301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
58056 58302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
58057 58303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the input FuncDef structure is ephemeral, then free it. If
@@ -58979,10 +59225,11 @@
58979 59225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nMem = 10;
58980 59226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
58981 59227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(zCsr, 0, zEnd-zCsr);
58982 59228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zCsr += (zCsr - (u8*)0)&7;
58983 59229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( EIGHT_BYTE_ALIGNMENT(zCsr) );
59230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->expired = 0;
58984 59231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
58985 59232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Memory for registers, parameters, cursor, etc, is allocated in two
58986 59233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** passes. On the first pass, we try to reuse unused space at the
58987 59234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** end of the opcode array. If we are unable to satisfy all memory
58988 59235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** requirements by reusing the opcode array tail, then the second
@@ -61178,10 +61425,18 @@
61178 61425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = db->errCode = p->rc;
61179 61426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
61180 61427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return (rc&db->errMask);
61181 61428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
61182 61429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
61430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
61431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The maximum number of times that a statement will try to reparse
61432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** itself before giving up and returning SQLITE_SCHEMA.
61433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
61434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_MAX_SCHEMA_RETRY
61435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define SQLITE_MAX_SCHEMA_RETRY 5
61436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
61437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
61183 61438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
61184 61439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This is the top-level implementation of sqlite3_step(). Call
61185 61440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3Step() to do most of the work. If a schema error occurs,
61186 61441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** call sqlite3Reprepare() and try again.
61187 61442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -61196,14 +61451,14 @@
61196 61451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_MISUSE_BKPT;
61197 61452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
61198 61453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db = v->db;
61199 61454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_mutex_enter(db->mutex);
61200 61455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( (rc = sqlite3Step(v))==SQLITE_SCHEMA
61201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && cnt++ < 5
61456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && cnt++ < SQLITE_MAX_SCHEMA_RETRY
61202 61457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& (rc2 = rc = sqlite3Reprepare(v))==SQLITE_OK ){
61203 61458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_reset(pStmt);
61204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- v->expired = 0;
61459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( v->expired==0 );
61205 61460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
61206 61461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc2!=SQLITE_OK && ALWAYS(v->isPrepareV2) && ALWAYS(db->pErr) ){
61207 61462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* This case occurs after failing to recompile an sql statement.
61208 61463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The error message from the SQL compiler has already been loaded
61209 61464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** into the database handle. This block copies the error message
@@ -63469,11 +63724,11 @@
63469 63724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
63470 63725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
63471 63726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
63472 63727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Opcode: HaltIfNull P1 P2 P3 P4 *
63473 63728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
63474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Check the value in register P3. If is is NULL then Halt using
63729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Check the value in register P3. If it is NULL then Halt using
63475 63730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** parameter P1, P2, and P4 as if this were a Halt instruction. If the
63476 63731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** value in register P3 is not NULL, then this routine is a no-op.
63477 63732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
63478 63733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case OP_HaltIfNull: { /* in3 */
63479 63734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIn3 = &aMem[pOp->p3];
@@ -63703,10 +63958,15 @@
63703 63958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( memIsValid(pIn1) );
63704 63959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memAboutToChange(p, pOut);
63705 63960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u.ac.zMalloc = pOut->zMalloc;
63706 63961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pOut->zMalloc = 0;
63707 63962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeMemMove(pOut, pIn1);
63963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_DEBUG
63964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pOut->pScopyFrom>=&aMem[u.ac.p1] && pOut->pScopyFrom<&aMem[u.ac.p1+pOp->p3] ){
63965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOut->pScopyFrom += u.ac.p1 - pOp->p2;
63966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
63967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
63708 63968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIn1->zMalloc = u.ac.zMalloc;
63709 63969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
REGISTER_TRACE(u.ac.p2++, pOut);
63710 63970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIn1++;
63711 63971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pOut++;
63712 63972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -64083,10 +64343,20 @@
64083 64343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u.ag.ctx.pColl = pOp[-1].p4.pColl;
64084 64344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
64085 64345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->lastRowid = lastRowid;
64086 64346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(*u.ag.ctx.pFunc->xFunc)(&u.ag.ctx, u.ag.n, u.ag.apVal); /* IMP: R-24505-23230 */
64087 64347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
lastRowid = db->lastRowid;
64348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
64349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If any auxiliary data functions have been called by this user function,
64350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** immediately call the destructor for any non-static values.
64351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
64352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( u.ag.ctx.pVdbeFunc ){
64353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeDeleteAuxData(u.ag.ctx.pVdbeFunc, pOp->p1);
64354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOp->p4.pVdbeFunc = u.ag.ctx.pVdbeFunc;
64355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOp->p4type = P4_VDBEFUNC;
64356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
64357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
64088 64358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db->mallocFailed ){
64089 64359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Even though a malloc() has failed, the implementation of the
64090 64360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** user function may have called an sqlite3_result_XXX() function
64091 64361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to return a value. The following call releases any resources
64092 64362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** associated with such a value.
@@ -64093,19 +64363,10 @@
64093 64363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
64094 64364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeMemRelease(&u.ag.ctx.s);
64095 64365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto no_mem;
64096 64366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
64097 64367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
64098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If any auxiliary data functions have been called by this user function,
64099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** immediately call the destructor for any non-static values.
64100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
64101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( u.ag.ctx.pVdbeFunc ){
64102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeDeleteAuxData(u.ag.ctx.pVdbeFunc, pOp->p1);
64103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOp->p4.pVdbeFunc = u.ag.ctx.pVdbeFunc;
64104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOp->p4type = P4_VDBEFUNC;
64105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
64106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
64107 64368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If the function returned an error, throw an exception */
64108 64369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( u.ag.ctx.isError ){
64109 64370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3SetString(&p->zErrMsg, db, "%s", sqlite3_value_text(&u.ag.ctx.s));
64110 64371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = u.ag.ctx.isError;
64111 64372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -64405,11 +64666,11 @@
64405 64666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** additional information.
64406 64667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
64407 64668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either
64408 64669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** true or false and is never NULL. If both operands are NULL then the result
64409 64670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of comparison is false. If either operand is NULL then the result is true.
64410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If neither operand is NULL the the result is the same as it would be if
64671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If neither operand is NULL the result is the same as it would be if
64411 64672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the SQLITE_NULLEQ flag were omitted from P5.
64412 64673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
64413 64674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Opcode: Eq P1 P2 P3 P4 P5
64414 64675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
64415 64676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This works just like the Lt opcode except that the jump is taken if
@@ -64417,11 +64678,11 @@
64417 64678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** See the Lt opcode for additional information.
64418 64679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
64419 64680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If SQLITE_NULLEQ is set in P5 then the result of comparison is always either
64420 64681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** true or false and is never NULL. If both operands are NULL then the result
64421 64682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of comparison is true. If either operand is NULL then the result is false.
64422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If neither operand is NULL the the result is the same as it would be if
64683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If neither operand is NULL the result is the same as it would be if
64423 64684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the SQLITE_NULLEQ flag were omitted from P5.
64424 64685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
64425 64686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Opcode: Le P1 P2 P3 P4 P5
64426 64687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
64427 64688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This works just like the Lt opcode except that the jump is taken if
@@ -64702,17 +64963,17 @@
64702 64963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
64703 64964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
64704 64965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
64705 64966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Opcode: If P1 P2 P3 * *
64706 64967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
64707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Jump to P2 if the value in register P1 is true. The value is
64968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Jump to P2 if the value in register P1 is true. The value
64708 64969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is considered true if it is numeric and non-zero. If the value
64709 64970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** in P1 is NULL then take the jump if P3 is true.
64710 64971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
64711 64972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Opcode: IfNot P1 P2 P3 * *
64712 64973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
64713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Jump to P2 if the value in register P1 is False. The value is
64974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Jump to P2 if the value in register P1 is False. The value
64714 64975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is considered true if it has a numeric value of zero. If the value
64715 64976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** in P1 is NULL then take the jump if P3 is true.
64716 64977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
64717 64978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case OP_If: /* jump, in1 */
64718 64979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case OP_IfNot: { /* jump, in1 */
@@ -65889,11 +66150,11 @@
65889 66150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** automatically created table with root-page 1 (an BLOB_INTKEY table).
65890 66151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
65891 66152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pOp->p4.pKeyInfo ){
65892 66153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int pgno;
65893 66154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pOp->p4type==P4_KEYINFO );
65894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3BtreeCreateTable(u.ax.pCx->pBt, &pgno, BTREE_BLOBKEY);
66155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3BtreeCreateTable(u.ax.pCx->pBt, &pgno, BTREE_BLOBKEY | pOp->p5);
65895 66156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
65896 66157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pgno==MASTER_ROOT+1 );
65897 66158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3BtreeCursor(u.ax.pCx->pBt, pgno, 1,
65898 66159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(KeyInfo*)pOp->p4.z, u.ax.pCx->pCursor);
65899 66160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u.ax.pCx->pKeyInfo = pOp->p4.pKeyInfo;
@@ -66362,11 +66623,11 @@
66362 66623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
66363 66624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
66364 66625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
66365 66626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Opcode: NotExists P1 P2 P3 * *
66366 66627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
66367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Use the content of register P3 as a integer key. If a record
66628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Use the content of register P3 as an integer key. If a record
66368 66629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** with that key does not exist in table of P1, then jump to P2.
66369 66630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the record does exist, then fall through. The cursor is left
66370 66631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** pointing to the record if it exists.
66371 66632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
66372 66633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The difference between this operation and NotFound is that this
@@ -66440,11 +66701,11 @@
66440 66701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** written to register P2.
66441 66702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
66442 66703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If P3>0 then P3 is a register in the root frame of this VDBE that holds
66443 66704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the largest previously generated record number. No new record numbers are
66444 66705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** allowed to be less than this value. When this value reaches its maximum,
66445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** a SQLITE_FULL error is generated. The P3 register is updated with the '
66706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** an SQLITE_FULL error is generated. The P3 register is updated with the '
66446 66707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** generated record number. This P3 mechanism is used to help implement the
66447 66708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** AUTOINCREMENT feature.
66448 66709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
66449 66710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case OP_NewRowid: { /* out2-prerelease */
66450 66711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if 0 /* local variables moved into u.be */
@@ -67082,11 +67343,11 @@
67082 67343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
67083 67344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
67084 67345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
67085 67346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Opcode: IdxInsert P1 P2 P3 * P5
67086 67347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
67087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Register P2 holds a SQL index key made using the
67348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Register P2 holds an SQL index key made using the
67088 67349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** MakeRecord instructions. This opcode writes that key
67089 67350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** into the index P1. Data for the entry is nil.
67090 67351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
67091 67352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** P3 is a flag that provides a hint to the b-tree layer that this
67092 67353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** insert is likely to be an append.
@@ -70928,15 +71189,29 @@
70928 71189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Recursively resolve names in all subqueries
70929 71190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
70930 71191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<p->pSrc->nSrc; i++){
70931 71192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct SrcList_item *pItem = &p->pSrc->a[i];
70932 71193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pItem->pSelect ){
71194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ NameContext *pNC; /* Used to iterate name contexts */
71195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRef = 0; /* Refcount for pOuterNC and outer contexts */
70933 71196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zSavedContext = pParse->zAuthContext;
71197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
71198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Count the total number of references to pOuterNC and all of its
71199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** parent contexts. After resolving references to expressions in
71200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pItem->pSelect, check if this value has changed. If so, then
71201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SELECT statement pItem->pSelect must be correlated. Set the
71202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pItem->isCorrelated flag if this is the case. */
71203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pNC=pOuterNC; pNC; pNC=pNC->pNext) nRef += pNC->nRef;
71204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
70934 71205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pItem->zName ) pParse->zAuthContext = pItem->zName;
70935 71206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ResolveSelectNames(pParse, pItem->pSelect, pOuterNC);
70936 71207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pParse->zAuthContext = zSavedContext;
70937 71208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pParse->nErr || db->mallocFailed ) return WRC_Abort;
71209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
71210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pNC=pOuterNC; pNC; pNC=pNC->pNext) nRef -= pNC->nRef;
71211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pItem->isCorrelated==0 && nRef<=0 );
71212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pItem->isCorrelated = (nRef!=0);
70938 71213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
70939 71214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
70940 71215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
70941 71216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there are no aggregate functions in the result-set, and no GROUP BY
70942 71217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** expression, do not allow aggregates in any of the other expressions.
@@ -72040,10 +72315,11 @@
72040 72315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNewItem->zName = sqlite3DbStrDup(db, pOldItem->zName);
72041 72316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNewItem->zAlias = sqlite3DbStrDup(db, pOldItem->zAlias);
72042 72317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNewItem->jointype = pOldItem->jointype;
72043 72318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNewItem->iCursor = pOldItem->iCursor;
72044 72319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNewItem->isPopulated = pOldItem->isPopulated;
72320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pNewItem->isCorrelated = pOldItem->isCorrelated;
72045 72321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNewItem->zIndex = sqlite3DbStrDup(db, pOldItem->zIndex);
72046 72322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNewItem->notIndexed = pOldItem->notIndexed;
72047 72323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNewItem->pIndex = pOldItem->pIndex;
72048 72324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTab = pNewItem->pTab = pOldItem->pTab;
72049 72325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTab ){
@@ -75255,18 +75531,18 @@
75255 75531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0);
75256 75532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75257 75533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Reload the table, index and permanent trigger schemas. */
75258 75534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zWhere = sqlite3MPrintf(pParse->db, "tbl_name=%Q", zName);
75259 75535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !zWhere ) return;
75260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp4(v, OP_ParseSchema, iDb, 0, 0, zWhere, P4_DYNAMIC);
75536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere);
75261 75537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75262 75538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_TRIGGER
75263 75539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Now, if the table is not stored in the temp database, reload any temp
75264 75540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** triggers. Don't use IN(...) in case SQLITE_OMIT_SUBQUERY is defined.
75265 75541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
75266 75542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (zWhere=whereTempTriggers(pParse, pTab))!=0 ){
75267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp4(v, OP_ParseSchema, 1, 0, 0, zWhere, P4_DYNAMIC);
75543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddParseSchemaOp(v, 1, zWhere);
75268 75544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
75269 75545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
75270 75546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
75271 75547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75272 75548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -75736,10 +76012,100 @@
75736 76012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** May you find forgiveness for yourself and forgive others.
75737 76013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** May you share freely, never taking more than you give.
75738 76014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
75739 76015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*************************************************************************
75740 76016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This file contains code associated with the ANALYZE command.
76017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The ANALYZE command gather statistics about the content of tables
76019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and indices. These statistics are made available to the query planner
76020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to help it make better decisions about how to perform queries.
76021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The following system tables are or have been supported:
76023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** CREATE TABLE sqlite_stat1(tbl, idx, stat);
76025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** CREATE TABLE sqlite_stat2(tbl, idx, sampleno, sample);
76026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** CREATE TABLE sqlite_stat3(tbl, idx, nEq, nLt, nDLt, sample);
76027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Additional tables might be added in future releases of SQLite.
76029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The sqlite_stat2 table is not created or used unless the SQLite version
76030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is between 3.6.18 and 3.7.7, inclusive, and unless SQLite is compiled
76031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** with SQLITE_ENABLE_STAT2. The sqlite_stat2 table is deprecated.
76032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The sqlite_stat2 table is superceded by sqlite_stat3, which is only
76033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** created and used by SQLite versions after 2011-08-09 with
76034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_ENABLE_STAT3 defined. The fucntionality of sqlite_stat3
76035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is a superset of sqlite_stat2.
76036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Format of sqlite_stat1:
76038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** There is normally one row per index, with the index identified by the
76040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** name in the idx column. The tbl column is the name of the table to
76041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** which the index belongs. In each such row, the stat column will be
76042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a string consisting of a list of integers. The first integer in this
76043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** list is the number of rows in the index and in the table. The second
76044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** integer is the average number of rows in the index that have the same
76045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** value in the first column of the index. The third integer is the average
76046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** number of rows in the index that have the same value for the first two
76047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** columns. The N-th integer (for N>1) is the average number of rows in
76048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the index which have the same value for the first N-1 columns. For
76049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a K-column index, there will be K+1 integers in the stat column. If
76050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the index is unique, then the last integer will be 1.
76051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The list of integers in the stat column can optionally be followed
76053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by the keyword "unordered". The "unordered" keyword, if it is present,
76054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** must be separated from the last integer by a single space. If the
76055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "unordered" keyword is present, then the query planner assumes that
76056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the index is unordered and will not use the index for a range query.
76057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the sqlite_stat1.idx column is NULL, then the sqlite_stat1.stat
76059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** column contains a single integer which is the (estimated) number of
76060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** rows in the table identified by sqlite_stat1.tbl.
76061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Format of sqlite_stat2:
76063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The sqlite_stat2 is only created and is only used if SQLite is compiled
76065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** with SQLITE_ENABLE_STAT2 and if the SQLite version number is between
76066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 3.6.18 and 3.7.7. The "stat2" table contains additional information
76067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** about the distribution of keys within an index. The index is identified by
76068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the "idx" column and the "tbl" column is the name of the table to which
76069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the index belongs. There are usually 10 rows in the sqlite_stat2
76070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** table for each index.
76071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The sqlite_stat2 entries for an index that have sampleno between 0 and 9
76073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** inclusive are samples of the left-most key value in the index taken at
76074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** evenly spaced points along the index. Let the number of samples be S
76075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (10 in the standard build) and let C be the number of rows in the index.
76076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Then the sampled rows are given by:
76077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** rownumber = (i*C*2 + C)/(S*2)
76079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** For i between 0 and S-1. Conceptually, the index space is divided into
76081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** S uniform buckets and the samples are the middle row from each bucket.
76082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The format for sqlite_stat2 is recorded here for legacy reference. This
76084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** version of SQLite does not support sqlite_stat2. It neither reads nor
76085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** writes the sqlite_stat2 table. This version of SQLite only supports
76086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite_stat3.
76087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Format for sqlite_stat3:
76089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The sqlite_stat3 is an enhancement to sqlite_stat2. A new name is
76091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** used to avoid compatibility problems.
76092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The format of the sqlite_stat3 table is similar to the format for
76094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the sqlite_stat2 table, with the following changes: (1)
76095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The sampleno column is removed. (2) Every sample has nEq, nLt, and nDLt
76096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** columns which hold the approximate number of rows in the table that
76097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** exactly match the sample, the approximate number of rows with values
76098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** less than the sample, and the approximate number of distinct key values
76099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** less than the sample, respectively. (3) The number of samples can vary
76100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** from one table to the next; the sample count does not have to be
76101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** exactly 10 as it is with sqlite_stat2.
76102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The ANALYZE command will typically generate sqlite_stat3 tables
76104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that contain between 10 and 40 samples which are distributed across
76105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the key space, though not uniformly, and which include samples with
76106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** largest possible nEq values.
75741 76107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
75742 76108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_ANALYZE
75743 76109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75744 76110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
75745 76111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine generates code that opens the sqlite_stat1 table for
@@ -75767,12 +76133,18 @@
75767 76133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const struct {
75768 76134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zName;
75769 76135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zCols;
75770 76136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} aTable[] = {
75771 76137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{ "sqlite_stat1", "tbl,idx,stat" },
75772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
75773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- { "sqlite_stat2", "tbl,idx,sampleno,sample" },
76138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
76139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "sqlite_stat3", "tbl,idx,neq,nlt,ndlt,sample" },
76140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
76141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
76142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char *azToDrop[] = {
76143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "sqlite_stat2",
76144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_ENABLE_STAT3
76145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "sqlite_stat3",
75774 76146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
75775 76147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
75776 76148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75777 76149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int aRoot[] = {0, 0};
75778 76150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 aCreateTbl[] = {0, 0};
@@ -75784,10 +76156,21 @@
75784 76156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( v==0 ) return;
75785 76157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( sqlite3BtreeHoldsAllMutexes(db) );
75786 76158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( sqlite3VdbeDb(v)==db );
75787 76159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pDb = &db->aDb[iDb];
75788 76160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Drop all statistics tables that this version of SQLite does not
76162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** understand.
76163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
76164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<ArraySize(azToDrop); i++){
76165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Table *pTab = sqlite3FindTable(db, azToDrop[i], pDb->zName);
76166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pTab ) sqlite3CodeDropTable(pParse, pTab, iDb, 0);
76167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Create new statistic tables if they do not exist, or clear them
76170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if they do already exist.
76171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
75789 76172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<ArraySize(aTable); i++){
75790 76173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTab = aTable[i].zName;
75791 76174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Table *pStat;
75792 76175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (pStat = sqlite3FindTable(db, zTab, pDb->zName))==0 ){
75793 76176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The sqlite_stat[12] table does not exist. Create it. Note that a
@@ -75814,17 +76197,238 @@
75814 76197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Clear, aRoot[i], iDb);
75815 76198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
75816 76199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
75817 76200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
75818 76201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Open the sqlite_stat[12] tables for writing. */
76202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Open the sqlite_stat[13] tables for writing. */
75820 76203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<ArraySize(aTable); i++){
75821 76204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp3(v, OP_OpenWrite, iStatCur+i, aRoot[i], iDb);
75822 76205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeChangeP4(v, -1, (char *)3, P4_INT32);
75823 76206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeChangeP5(v, aCreateTbl[i]);
75824 76207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
75825 76208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
76211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Recommended number of samples for sqlite_stat3
76212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
76213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_STAT3_SAMPLES
76214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define SQLITE_STAT3_SAMPLES 24
76215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
76216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
76218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Three SQL functions - stat3_init(), stat3_push(), and stat3_pop() -
76219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** share an instance of the following structure to hold their state
76220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** information.
76221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
76222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct Stat3Accum Stat3Accum;
76223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Stat3Accum {
76224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt nRow; /* Number of rows in the entire table */
76225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt nPSample; /* How often to do a periodic sample */
76226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iMin; /* Index of entry with minimum nEq and hash */
76227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int mxSample; /* Maximum number of samples to accumulate */
76228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nSample; /* Current number of samples */
76229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iPrn; /* Pseudo-random number used for sampling */
76230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Stat3Sample {
76231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 iRowid; /* Rowid in main table of the key */
76232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt nEq; /* sqlite_stat3.nEq */
76233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt nLt; /* sqlite_stat3.nLt */
76234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt nDLt; /* sqlite_stat3.nDLt */
76235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 isPSample; /* True if a periodic sample */
76236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 iHash; /* Tiebreaker hash */
76237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } *a; /* An array of samples */
76238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
76239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
76241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
76242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Implementation of the stat3_init(C,S) SQL function. The two parameters
76243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are the number of rows in the table or index (C) and the number of samples
76244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to accumulate (S).
76245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine allocates the Stat3Accum object.
76247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The return value is the Stat3Accum object (P).
76249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
76250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void stat3Init(
76251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_context *context,
76252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int argc,
76253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_value **argv
76254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
76255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stat3Accum *p;
76256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt nRow;
76257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int mxSample;
76258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n;
76259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UNUSED_PARAMETER(argc);
76261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nRow = (tRowcnt)sqlite3_value_int64(argv[0]);
76262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mxSample = sqlite3_value_int(argv[1]);
76263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ n = sizeof(*p) + sizeof(p->a[0])*mxSample;
76264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p = sqlite3_malloc( n );
76265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p==0 ){
76266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_result_error_nomem(context);
76267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
76268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(p, 0, n);
76270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->a = (struct Stat3Sample*)&p[1];
76271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nRow = nRow;
76272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->mxSample = mxSample;
76273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nPSample = p->nRow/(mxSample/3+1) + 1;
76274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_randomness(sizeof(p->iPrn), &p->iPrn);
76275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_result_blob(context, p, sizeof(p), sqlite3_free);
76276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const FuncDef stat3InitFuncdef = {
76278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 2, /* nArg */
76279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_UTF8, /* iPrefEnc */
76280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* flags */
76281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* pUserData */
76282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* pNext */
76283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ stat3Init, /* xFunc */
76284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* xStep */
76285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* xFinalize */
76286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "stat3_init", /* zName */
76287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* pHash */
76288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0 /* pDestructor */
76289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
76290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
76293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Implementation of the stat3_push(nEq,nLt,nDLt,rowid,P) SQL function. The
76294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** arguments describe a single key instance. This routine makes the
76295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** decision about whether or not to retain this key for the sqlite_stat3
76296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** table.
76297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The return value is NULL.
76299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
76300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void stat3Push(
76301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_context *context,
76302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int argc,
76303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_value **argv
76304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
76305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stat3Accum *p = (Stat3Accum*)sqlite3_value_blob(argv[4]);
76306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt nEq = sqlite3_value_int64(argv[0]);
76307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt nLt = sqlite3_value_int64(argv[1]);
76308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt nDLt = sqlite3_value_int64(argv[2]);
76309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 rowid = sqlite3_value_int64(argv[3]);
76310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 isPSample = 0;
76311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 doInsert = 0;
76312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iMin = p->iMin;
76313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Stat3Sample *pSample;
76314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
76315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 h;
76316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UNUSED_PARAMETER(context);
76318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UNUSED_PARAMETER(argc);
76319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nEq==0 ) return;
76320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ h = p->iPrn = p->iPrn*1103515245 + 12345;
76321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (nLt/p->nPSample)!=((nEq+nLt)/p->nPSample) ){
76322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ doInsert = isPSample = 1;
76323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( p->nSample<p->mxSample ){
76324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ doInsert = 1;
76325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
76326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nEq>p->a[iMin].nEq || (nEq==p->a[iMin].nEq && h>p->a[iMin].iHash) ){
76327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ doInsert = 1;
76328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !doInsert ) return;
76331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->nSample==p->mxSample ){
76332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iMin<p->nSample ){
76333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(&p->a[iMin], &p->a[iMin+1], sizeof(p->a[0])*(p->nSample-iMin));
76334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample = &p->a[p->nSample-1];
76336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
76337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample = &p->a[p->nSample++];
76338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->iRowid = rowid;
76340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->nEq = nEq;
76341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->nLt = nLt;
76342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->nDLt = nDLt;
76343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->iHash = h;
76344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->isPSample = isPSample;
76345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Find the new minimum */
76347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->nSample==p->mxSample ){
76348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample = p->a;
76349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = 0;
76350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pSample->isPSample ){
76351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i++;
76352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample++;
76353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( i<p->nSample );
76354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nEq = pSample->nEq;
76356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ h = pSample->iHash;
76357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iMin = i;
76358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i++, pSample++; i<p->nSample; i++, pSample++){
76359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pSample->isPSample ) continue;
76360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pSample->nEq<nEq
76361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || (pSample->nEq==nEq && pSample->iHash<h)
76362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
76363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iMin = i;
76364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nEq = pSample->nEq;
76365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ h = pSample->iHash;
76366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->iMin = iMin;
76369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const FuncDef stat3PushFuncdef = {
76372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 5, /* nArg */
76373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_UTF8, /* iPrefEnc */
76374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* flags */
76375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* pUserData */
76376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* pNext */
76377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ stat3Push, /* xFunc */
76378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* xStep */
76379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* xFinalize */
76380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "stat3_push", /* zName */
76381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* pHash */
76382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0 /* pDestructor */
76383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
76384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
76386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Implementation of the stat3_get(P,N,...) SQL function. This routine is
76387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** used to query the results. Content is returned for the Nth sqlite_stat3
76388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** row where N is between 0 and S-1 and S is the number of samples. The
76389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** value returned depends on the number of arguments.
76390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
76391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** argc==2 result: rowid
76392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** argc==3 result: nEq
76393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** argc==4 result: nLt
76394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** argc==5 result: nDLt
76395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
76396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void stat3Get(
76397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_context *context,
76398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int argc,
76399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_value **argv
76400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
76401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = sqlite3_value_int(argv[1]);
76402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Stat3Accum *p = (Stat3Accum*)sqlite3_value_blob(argv[0]);
76403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p!=0 );
76405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->nSample<=n ) return;
76406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( argc ){
76407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 2: sqlite3_result_int64(context, p->a[n].iRowid); break;
76408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 3: sqlite3_result_int64(context, p->a[n].nEq); break;
76409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 4: sqlite3_result_int64(context, p->a[n].nLt); break;
76410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 5: sqlite3_result_int64(context, p->a[n].nDLt); break;
76411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const FuncDef stat3GetFuncdef = {
76414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ -1, /* nArg */
76415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_UTF8, /* iPrefEnc */
76416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* flags */
76417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* pUserData */
76418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* pNext */
76419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ stat3Get, /* xFunc */
76420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* xStep */
76421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* xFinalize */
76422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "stat3_get", /* zName */
76423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0, /* pHash */
76424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ 0 /* pDestructor */
76425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
76426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_ENABLE_STAT3 */
76427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
75826 76430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75827 76431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
75828 76432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Generate code to do an analysis of all indices associated with
75829 76433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a single table.
75830 76434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -75844,24 +76448,31 @@
75844 76448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int endOfLoop; /* The end of the loop */
75845 76449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int jZeroRows = -1; /* Jump from here if number of rows is zero */
75846 76450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iDb; /* Index of database containing pTab */
75847 76451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int regTabname = iMem++; /* Register containing table name */
75848 76452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int regIdxname = iMem++; /* Register containing index name */
75849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int regSampleno = iMem++; /* Register containing next sample number */
75850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int regCol = iMem++; /* Content of a column analyzed table */
76453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regStat1 = iMem++; /* The stat column of sqlite_stat1 */
76454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
76455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regNumEq = regStat1; /* Number of instances. Same as regStat1 */
76456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regNumLt = iMem++; /* Number of keys less than regSample */
76457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regNumDLt = iMem++; /* Number of distinct keys less than regSample */
76458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regSample = iMem++; /* The next sample value */
76459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regRowid = regSample; /* Rowid of a sample */
76460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regAccum = iMem++; /* Register to hold Stat3Accum object */
76461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regLoop = iMem++; /* Loop counter */
76462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regCount = iMem++; /* Number of rows in the table or index */
76463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regTemp1 = iMem++; /* Intermediate register */
76464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regTemp2 = iMem++; /* Intermediate register */
76465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int once = 1; /* One-time initialization */
76466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int shortJump = 0; /* Instruction address */
76467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iTabCur = pParse->nTab++; /* Table cursor */
76468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
76469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regCol = iMem++; /* Content of a column in analyzed table */
75851 76470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int regRec = iMem++; /* Register holding completed record */
75852 76471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int regTemp = iMem++; /* Temporary use register */
75853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int regRowid = iMem++; /* Rowid for the inserted record */
75854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
75855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
75856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int addr = 0; /* Instruction address */
75857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int regTemp2 = iMem++; /* Temporary use register */
75858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int regSamplerecno = iMem++; /* Index of next sample to record */
75859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int regRecno = iMem++; /* Current sample index */
75860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int regLast = iMem++; /* Index of last sample to record */
75861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int regFirst = iMem++; /* Index of first sample to record */
75862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
76472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int regNewRowid = iMem++; /* Rowid for the inserted record */
76473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
75863 76474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75864 76475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
v = sqlite3GetVdbe(pParse);
75865 76476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( v==0 || NEVER(pTab==0) ){
75866 76477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
75867 76478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -75890,17 +76501,22 @@
75890 76501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iIdxCur = pParse->nTab++;
75891 76502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp4(v, OP_String8, 0, regTabname, 0, pTab->zName, 0);
75892 76503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
75893 76504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nCol;
75894 76505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
KeyInfo *pKey;
76506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int addrIfNot = 0; /* address of OP_IfNot */
76507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *aChngAddr; /* Array of jump instruction addresses */
75895 76508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75896 76509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pOnlyIdx && pOnlyIdx!=pIdx ) continue;
76510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ VdbeNoopComment((v, "Begin analysis of %s", pIdx->zName));
75897 76511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nCol = pIdx->nColumn;
75898 76512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pKey = sqlite3IndexKeyinfo(pParse, pIdx);
75899 76513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iMem+1+(nCol*2)>pParse->nMem ){
75900 76514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pParse->nMem = iMem+1+(nCol*2);
75901 76515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aChngAddr = sqlite3DbMallocRaw(db, sizeof(int)*pIdx->nColumn);
76517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aChngAddr==0 ) continue;
75902 76518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75903 76519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Open a cursor to the index to be analyzed. */
75904 76520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( iDb==sqlite3SchemaToIndex(db, pIdx->pSchema) );
75905 76521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp4(v, OP_OpenRead, iIdxCur, pIdx->tnum, iDb,
75906 76522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(char *)pKey, P4_KEYINFO_HANDOFF);
@@ -75907,35 +76523,24 @@
75907 76523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VdbeComment((v, "%s", pIdx->zName));
75908 76524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75909 76525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Populate the register containing the index name. */
75910 76526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp4(v, OP_String8, 0, regIdxname, 0, pIdx->zName, 0);
75911 76527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
75913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
75914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If this iteration of the loop is generating code to analyze the
75915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** first index in the pTab->pIndex list, then register regLast has
75916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** not been populated. In this case populate it now. */
75917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pTab->pIndex==pIdx ){
75918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES, regSamplerecno);
75919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES*2-1, regTemp);
75920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES*2, regTemp2);
75921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
75922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regLast);
75923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_Null, 0, regFirst);
75924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- addr = sqlite3VdbeAddOp3(v, OP_Lt, regSamplerecno, 0, regLast);
75925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Divide, regTemp2, regLast, regFirst);
75926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Multiply, regLast, regTemp, regLast);
75927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_AddImm, regLast, SQLITE_INDEX_SAMPLES*2-2);
75928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Divide, regTemp2, regLast, regLast);
75929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeJumpHere(v, addr);
75930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
75931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
75932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Zero the regSampleno and regRecno registers. */
75933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_Integer, 0, regSampleno);
75934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_Integer, 0, regRecno);
75935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_Copy, regFirst, regSamplerecno);
75936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
76528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
76529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( once ){
76530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ once = 0;
76531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3OpenTable(pParse, iTabCur, iDb, pTab, OP_OpenRead);
76532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regCount);
76534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_STAT3_SAMPLES, regTemp1);
76535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, regNumEq);
76536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, regNumLt);
76537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_Integer, -1, regNumDLt);
76538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp4(v, OP_Function, 1, regCount, regAccum,
76539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (char*)&stat3InitFuncdef, P4_FUNCDEF);
76540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP5(v, 2);
76541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_ENABLE_STAT3 */
75937 76542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75938 76543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The block of memory cells initialized here is used as follows.
75939 76544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
75940 76545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** iMem:
75941 76546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The total number of rows in the table.
@@ -75961,79 +76566,87 @@
75961 76566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Start the analysis loop. This loop runs through all the entries in
75962 76567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the index b-tree. */
75963 76568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
endOfLoop = sqlite3VdbeMakeLabel(v);
75964 76569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Rewind, iIdxCur, endOfLoop);
75965 76570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
topOfLoop = sqlite3VdbeCurrentAddr(v);
75966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_AddImm, iMem, 1);
76571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_AddImm, iMem, 1); /* Increment row counter */
75967 76572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
75968 76573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<nCol; i++){
75969 76574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
CollSeq *pColl;
75970 76575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, regCol);
75971 76576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( i==0 ){
75972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
75973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Check if the record that cursor iIdxCur points to contains a
75974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** value that should be stored in the sqlite_stat2 table. If so,
75975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** store it. */
75976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int ne = sqlite3VdbeAddOp3(v, OP_Ne, regRecno, 0, regSamplerecno);
75977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( regTabname+1==regIdxname
75978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && regTabname+2==regSampleno
75979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && regTabname+3==regCol
75980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
75981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL);
75982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 4, regRec, "aaab", 0);
75983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur+1, regRowid);
75984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Insert, iStatCur+1, regRec, regRowid);
75985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
75986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Calculate new values for regSamplerecno and regSampleno.
75987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
75988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** sampleno = sampleno + 1
75989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** samplerecno = samplerecno+(remaining records)/(remaining samples)
75990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
75991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_AddImm, regSampleno, 1);
75992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Subtract, regRecno, regLast, regTemp);
75993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_AddImm, regTemp, -1);
75994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_Integer, SQLITE_INDEX_SAMPLES, regTemp2);
75995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Subtract, regSampleno, regTemp2, regTemp2);
75996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Divide, regTemp2, regTemp, regTemp);
75997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Add, regSamplerecno, regTemp, regSamplerecno);
75998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
75999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeJumpHere(v, ne);
76000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_AddImm, regRecno, 1);
76001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
76002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
76003 76577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Always record the very first row */
76004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp1(v, OP_IfNot, iMem+1);
76578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ addrIfNot = sqlite3VdbeAddOp1(v, OP_IfNot, iMem+1);
76005 76579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76006 76580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pIdx->azColl!=0 );
76007 76581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pIdx->azColl[i]!=0 );
76008 76582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pColl = sqlite3LocateCollSeq(pParse, pIdx->azColl[i]);
76009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp4(v, OP_Ne, regCol, 0, iMem+nCol+i+1,
76010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (char*)pColl, P4_COLLSEQ);
76583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aChngAddr[i] = sqlite3VdbeAddOp4(v, OP_Ne, regCol, 0, iMem+nCol+i+1,
76584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (char*)pColl, P4_COLLSEQ);
76011 76585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeChangeP5(v, SQLITE_NULLEQ);
76012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
76013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( db->mallocFailed ){
76014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If a malloc failure has occurred, then the result of the expression
76015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** passed as the second argument to the call to sqlite3VdbeJumpHere()
76016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** below may be negative. Which causes an assert() to fail (or an
76017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** out-of-bounds write if SQLITE_DEBUG is not defined). */
76018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return;
76586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ VdbeComment((v, "jump if column %d changed", i));
76587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
76588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i==0 ){
76589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_AddImm, regNumEq, 1);
76590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ VdbeComment((v, "incr repeat count"));
76591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
76019 76593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76020 76594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Goto, 0, endOfLoop);
76021 76595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<nCol; i++){
76022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int addr2 = sqlite3VdbeCurrentAddr(v) - (nCol*2);
76596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeJumpHere(v, aChngAddr[i]); /* Set jump dest for the OP_Ne */
76023 76597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( i==0 ){
76024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeJumpHere(v, addr2-1); /* Set jump dest for the OP_IfNot */
76598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeJumpHere(v, addrIfNot); /* Jump dest for OP_IfNot */
76599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
76600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp4(v, OP_Function, 1, regNumEq, regTemp2,
76601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (char*)&stat3PushFuncdef, P4_FUNCDEF);
76602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP5(v, 5);
76603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, pIdx->nColumn, regRowid);
76604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_Add, regNumEq, regNumLt, regNumLt);
76605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_AddImm, regNumDLt, 1);
76606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_Integer, 1, regNumEq);
76607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
76025 76608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeJumpHere(v, addr2); /* Set jump dest for the OP_Ne */
76027 76609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_AddImm, iMem+i+1, 1);
76028 76610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp3(v, OP_Column, iIdxCur, i, iMem+nCol+i+1);
76029 76611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DbFree(db, aChngAddr);
76030 76613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* End of the analysis loop. */
76614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Always jump here after updating the iMem+1...iMem+1+nCol counters */
76032 76615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeResolveLabel(v, endOfLoop);
76616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76033 76617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Next, iIdxCur, topOfLoop);
76034 76618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp1(v, OP_Close, iIdxCur);
76619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
76620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp4(v, OP_Function, 1, regNumEq, regTemp2,
76621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (char*)&stat3PushFuncdef, P4_FUNCDEF);
76622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP5(v, 5);
76623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_Integer, -1, regLoop);
76624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ shortJump =
76625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_AddImm, regLoop, 1);
76626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp4(v, OP_Function, 1, regAccum, regTemp1,
76627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (char*)&stat3GetFuncdef, P4_FUNCDEF);
76628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP5(v, 2);
76629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp1(v, OP_IsNull, regTemp1);
76630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_NotExists, iTabCur, shortJump, regTemp1);
76631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_Column, iTabCur, pIdx->aiColumn[0], regSample);
76632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ColumnDefault(v, pTab, pIdx->aiColumn[0], regSample);
76633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp4(v, OP_Function, 1, regAccum, regNumEq,
76634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (char*)&stat3GetFuncdef, P4_FUNCDEF);
76635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP5(v, 3);
76636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp4(v, OP_Function, 1, regAccum, regNumLt,
76637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (char*)&stat3GetFuncdef, P4_FUNCDEF);
76638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP5(v, 4);
76639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp4(v, OP_Function, 1, regAccum, regNumDLt,
76640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (char*)&stat3GetFuncdef, P4_FUNCDEF);
76641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP5(v, 5);
76642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 6, regRec, "bbbbbb", 0);
76643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur+1, regNewRowid);
76644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_Insert, iStatCur+1, regRec, regNewRowid);
76645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, shortJump);
76646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeJumpHere(v, shortJump+2);
76647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
76035 76648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76036 76649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Store the results in sqlite_stat1.
76037 76650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
76038 76651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The result is a single row of the sqlite_stat1 table. The first
76039 76652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** two columns are the names of the table and index. The third column
@@ -76049,50 +76662,51 @@
76049 76662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
76050 76663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If K==0 then no entry is made into the sqlite_stat1 table.
76051 76664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If K>0 then it is always the case the D>0 so division by zero
76052 76665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is never possible.
76053 76666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
76054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_SCopy, iMem, regSampleno);
76667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_SCopy, iMem, regStat1);
76055 76668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( jZeroRows<0 ){
76056 76669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
jZeroRows = sqlite3VdbeAddOp1(v, OP_IfNot, iMem);
76057 76670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76058 76671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<nCol; i++){
76059 76672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp4(v, OP_String8, 0, regTemp, 0, " ", 0);
76060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Concat, regTemp, regSampleno, regSampleno);
76673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_Concat, regTemp, regStat1, regStat1);
76061 76674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp3(v, OP_Add, iMem, iMem+i+1, regTemp);
76062 76675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_AddImm, regTemp, -1);
76063 76676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp3(v, OP_Divide, iMem+i+1, regTemp, regTemp);
76064 76677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp1(v, OP_ToInt, regTemp);
76065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Concat, regTemp, regSampleno, regSampleno);
76678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_Concat, regTemp, regStat1, regStat1);
76066 76679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76067 76680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regRec, "aaa", 0);
76068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regRowid);
76069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regRec, regRowid);
76681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid);
76682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regRec, regNewRowid);
76070 76683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
76071 76684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76072 76685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76073 76686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If the table has no indices, create a single sqlite_stat1 entry
76074 76687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** containing NULL as the index name and the row count as the content.
76075 76688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
76076 76689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTab->pIndex==0 ){
76077 76690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp3(v, OP_OpenRead, iIdxCur, pTab->tnum, iDb);
76078 76691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
VdbeComment((v, "%s", pTab->zName));
76079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regSampleno);
76692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_Count, iIdxCur, regStat1);
76080 76693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp1(v, OP_Close, iIdxCur);
76081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- jZeroRows = sqlite3VdbeAddOp1(v, OP_IfNot, regSampleno);
76694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ jZeroRows = sqlite3VdbeAddOp1(v, OP_IfNot, regStat1);
76082 76695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
76083 76696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeJumpHere(v, jZeroRows);
76084 76697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
jZeroRows = sqlite3VdbeAddOp0(v, OP_Goto);
76085 76698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76086 76699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Null, 0, regIdxname);
76087 76700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp4(v, OP_MakeRecord, regTabname, 3, regRec, "aaa", 0);
76088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regRowid);
76089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regRec, regRowid);
76701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_NewRowid, iStatCur, regNewRowid);
76702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_Insert, iStatCur, regRec, regNewRowid);
76090 76703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeChangeP5(v, OPFLAG_APPEND);
76091 76704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pParse->nMem<regRec ) pParse->nMem = regRec;
76092 76705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeJumpHere(v, jZeroRows);
76093 76706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76094 76708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76095 76709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
76096 76710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Generate code that will cause the most recent index analysis to
76097 76711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be loaded into internal hash tables where is can be used.
76098 76712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -76113,11 +76727,11 @@
76113 76727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iStatCur;
76114 76728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iMem;
76115 76729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76116 76730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BeginWriteOperation(pParse, 0, iDb);
76117 76731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iStatCur = pParse->nTab;
76118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pParse->nTab += 2;
76732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pParse->nTab += 3;
76119 76733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
openStatTable(pParse, iDb, iStatCur, 0, 0);
76120 76734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iMem = pParse->nMem+1;
76121 76735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
76122 76736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(k=sqliteHashFirst(&pSchema->tblHash); k; k=sqliteHashNext(k)){
76123 76737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Table *pTab = (Table*)sqliteHashData(k);
@@ -76138,11 +76752,11 @@
76138 76752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pTab!=0 );
76139 76753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( sqlite3BtreeHoldsAllMutexes(pParse->db) );
76140 76754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iDb = sqlite3SchemaToIndex(pParse->db, pTab->pSchema);
76141 76755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BeginWriteOperation(pParse, 0, iDb);
76142 76756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iStatCur = pParse->nTab;
76143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pParse->nTab += 2;
76757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pParse->nTab += 3;
76144 76758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pOnlyIdx ){
76145 76759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
openStatTable(pParse, iDb, iStatCur, pOnlyIdx->zName, "idx");
76146 76760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
76147 76761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
openStatTable(pParse, iDb, iStatCur, pTab->zName, "tbl");
76148 76762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -76243,11 +76857,11 @@
76243 76857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int analysisLoader(void *pData, int argc, char **argv, char **NotUsed){
76244 76858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
analysisInfo *pInfo = (analysisInfo*)pData;
76245 76859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Index *pIndex;
76246 76860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Table *pTable;
76247 76861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i, c, n;
76248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned int v;
76862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt v;
76249 76863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *z;
76250 76864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76251 76865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( argc==3 );
76252 76866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER2(NotUsed, argc);
76253 76867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -76286,40 +76900,172 @@
76286 76900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
76287 76901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the Index.aSample variable is not NULL, delete the aSample[] array
76288 76902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** and its contents.
76289 76903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
76290 76904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3DeleteIndexSamples(sqlite3 *db, Index *pIdx){
76291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
76905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
76292 76906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pIdx->aSample ){
76293 76907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int j;
76294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(j=0; j<SQLITE_INDEX_SAMPLES; j++){
76908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(j=0; j<pIdx->nSample; j++){
76295 76909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
IndexSample *p = &pIdx->aSample[j];
76296 76910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->eType==SQLITE_TEXT || p->eType==SQLITE_BLOB ){
76297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3DbFree(db, p->u.z);
76911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p->u.z);
76298 76912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76299 76913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3DbFree(db, pIdx->aSample);
76914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pIdx->aSample);
76301 76915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UNUSED_PARAMETER(db);
76917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIdx->nSample = 0;
76918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIdx->aSample = 0;
76302 76919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
76303 76920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(db);
76304 76921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(pIdx);
76305 76922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
76306 76923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76307 76924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
76308 76926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
76309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Load the content of the sqlite_stat1 and sqlite_stat2 tables. The
76927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Load content from the sqlite_stat3 table into the Index.aSample[]
76928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** arrays of all indices.
76929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
76930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int loadStat3(sqlite3 *db, const char *zDb){
76931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Result codes from subroutines */
76932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_stmt *pStmt = 0; /* An SQL statement being run */
76933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zSql; /* Text of the SQL statement */
76934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Index *pPrevIdx = 0; /* Previous index in the loop */
76935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int idx = 0; /* slot in pIdx->aSample[] for next sample */
76936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int eType; /* Datatype of a sample */
76937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ IndexSample *pSample; /* A slot in pIdx->aSample[] */
76938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !sqlite3FindTable(db, "sqlite_stat3", zDb) ){
76940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
76941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zSql = sqlite3MPrintf(db,
76944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT idx,count(*) FROM %Q.sqlite_stat3"
76945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ " GROUP BY idx", zDb);
76946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !zSql ){
76947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_NOMEM;
76948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0);
76950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DbFree(db, zSql);
76951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ) return rc;
76952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( sqlite3_step(pStmt)==SQLITE_ROW ){
76954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zIndex; /* Index name */
76955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Index *pIdx; /* Pointer to the index object */
76956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nSample; /* Number of samples */
76957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zIndex = (char *)sqlite3_column_text(pStmt, 0);
76959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zIndex==0 ) continue;
76960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nSample = sqlite3_column_int(pStmt, 1);
76961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nSample>255 ) continue;
76962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIdx = sqlite3FindIndex(db, zIndex, zDb);
76963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pIdx==0 ) continue;
76964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pIdx->nSample==0 );
76965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIdx->nSample = (u8)nSample;
76966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIdx->aSample = sqlite3MallocZero( nSample*sizeof(IndexSample) );
76967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIdx->avgEq = pIdx->aiRowEst[1];
76968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pIdx->aSample==0 ){
76969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->mallocFailed = 1;
76970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_finalize(pStmt);
76971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_NOMEM;
76972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_finalize(pStmt);
76975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zSql = sqlite3MPrintf(db,
76977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT idx,neq,nlt,ndlt,sample FROM %Q.sqlite_stat3", zDb);
76978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !zSql ){
76979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_NOMEM;
76980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
76981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0);
76982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DbFree(db, zSql);
76983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc ) return rc;
76984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( sqlite3_step(pStmt)==SQLITE_ROW ){
76986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zIndex; /* Index name */
76987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Index *pIdx; /* Pointer to the index object */
76988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Loop counter */
76989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt sumEq; /* Sum of the nEq values */
76990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zIndex = (char *)sqlite3_column_text(pStmt, 0);
76992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zIndex==0 ) continue;
76993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIdx = sqlite3FindIndex(db, zIndex, zDb);
76994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pIdx==0 ) continue;
76995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pIdx==pPrevIdx ){
76996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ idx++;
76997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
76998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPrevIdx = pIdx;
76999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ idx = 0;
77000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( idx<pIdx->nSample );
77002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample = &pIdx->aSample[idx];
77003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->nEq = (tRowcnt)sqlite3_column_int64(pStmt, 1);
77004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->nLt = (tRowcnt)sqlite3_column_int64(pStmt, 2);
77005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->nDLt = (tRowcnt)sqlite3_column_int64(pStmt, 3);
77006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( idx==pIdx->nSample-1 ){
77007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pSample->nDLt>0 ){
77008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0, sumEq=0; i<=idx-1; i++) sumEq += pIdx->aSample[i].nEq;
77009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIdx->avgEq = (pSample->nLt - sumEq)/pSample->nDLt;
77010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pIdx->avgEq<=0 ) pIdx->avgEq = 1;
77012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eType = sqlite3_column_type(pStmt, 4);
77014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->eType = (u8)eType;
77015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( eType ){
77016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case SQLITE_INTEGER: {
77017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->u.i = sqlite3_column_int64(pStmt, 4);
77018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
77019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case SQLITE_FLOAT: {
77021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->u.r = sqlite3_column_double(pStmt, 4);
77022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
77023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case SQLITE_NULL: {
77025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
77026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default: assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB ); {
77028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *z = (const char *)(
77029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (eType==SQLITE_BLOB) ?
77030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_column_blob(pStmt, 4):
77031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_column_text(pStmt, 4)
77032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
77033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = sqlite3_column_bytes(pStmt, 4);
77034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( n>0xffff ) n = 0xffff;
77035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->nByte = (u16)n;
77036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( n < 1){
77037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->u.z = 0;
77038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
77039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSample->u.z = sqlite3Malloc(n);
77040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pSample->u.z==0 ){
77041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->mallocFailed = 1;
77042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_finalize(pStmt);
77043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_NOMEM;
77044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(pSample->u.z, z, n);
77046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return sqlite3_finalize(pStmt);
77051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
77052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_ENABLE_STAT3 */
77053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
77054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
77055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Load the content of the sqlite_stat1 and sqlite_stat3 tables. The
76310 77056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** contents of sqlite_stat1 are used to populate the Index.aiRowEst[]
76311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** arrays. The contents of sqlite_stat2 are used to populate the
77057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** arrays. The contents of sqlite_stat3 are used to populate the
76312 77058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Index.aSample[] arrays.
76313 77059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
76314 77060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the sqlite_stat1 table is not present in the database, SQLITE_ERROR
76315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is returned. In this case, even if SQLITE_ENABLE_STAT2 was defined
76316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** during compilation and the sqlite_stat2 table is present, no data is
77061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is returned. In this case, even if SQLITE_ENABLE_STAT3 was defined
77062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** during compilation and the sqlite_stat3 table is present, no data is
76317 77063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** read from it.
76318 77064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
76319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If SQLITE_ENABLE_STAT2 was defined during compilation and the
76320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** sqlite_stat2 table is not present in the database, SQLITE_ERROR is
77065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If SQLITE_ENABLE_STAT3 was defined during compilation and the
77066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite_stat3 table is not present in the database, SQLITE_ERROR is
76321 77067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** returned. However, in this case, data is read from the sqlite_stat1
76322 77068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** table (if it is present) before returning.
76323 77069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
76324 77070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If an OOM error occurs, this function always sets db->mallocFailed.
76325 77071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This means if the caller does not care about other errors, the return
@@ -76337,12 +77083,14 @@
76337 77083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Clear any prior statistics */
76338 77084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( sqlite3SchemaMutexHeld(db, iDb, 0) );
76339 77085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=sqliteHashFirst(&db->aDb[iDb].pSchema->idxHash);i;i=sqliteHashNext(i)){
76340 77086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Index *pIdx = sqliteHashData(i);
76341 77087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DefaultRowEst(pIdx);
77088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
76342 77089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DeleteIndexSamples(db, pIdx);
76343 77090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdx->aSample = 0;
77091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
76344 77092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76345 77093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76346 77094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check to make sure the sqlite_stat1 table exists */
76347 77095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sInfo.db = db;
76348 77096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sInfo.zDatabase = db->aDb[iDb].zName;
@@ -76350,91 +77098,23 @@
76350 77098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_ERROR;
76351 77099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76352 77100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76353 77101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Load new statistics out of the sqlite_stat1 table */
76354 77102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zSql = sqlite3MPrintf(db,
76355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "SELECT tbl, idx, stat FROM %Q.sqlite_stat1", sInfo.zDatabase);
77103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "SELECT tbl,idx,stat FROM %Q.sqlite_stat1", sInfo.zDatabase);
76356 77104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zSql==0 ){
76357 77105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_NOMEM;
76358 77106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
76359 77107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3_exec(db, zSql, analysisLoader, &sInfo, 0);
76360 77108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, zSql);
76361 77109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76362 77110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76363 77111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Load the statistics from the sqlite_stat2 table. */
76365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
76366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK && !sqlite3FindTable(db, "sqlite_stat2", sInfo.zDatabase) ){
76367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_ERROR;
76368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
76369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
76370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_stmt *pStmt = 0;
76371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
76372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zSql = sqlite3MPrintf(db,
76373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "SELECT idx,sampleno,sample FROM %Q.sqlite_stat2", sInfo.zDatabase);
76374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !zSql ){
76375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_NOMEM;
76376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
76377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3_prepare(db, zSql, -1, &pStmt, 0);
76378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3DbFree(db, zSql);
76379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
76380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
76381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
76382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( sqlite3_step(pStmt)==SQLITE_ROW ){
76383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zIndex; /* Index name */
76384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Index *pIdx; /* Pointer to the index object */
76385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
76386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zIndex = (char *)sqlite3_column_text(pStmt, 0);
76387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIdx = zIndex ? sqlite3FindIndex(db, zIndex, sInfo.zDatabase) : 0;
76388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pIdx ){
76389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iSample = sqlite3_column_int(pStmt, 1);
76390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iSample<SQLITE_INDEX_SAMPLES && iSample>=0 ){
76391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int eType = sqlite3_column_type(pStmt, 2);
76392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
76393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pIdx->aSample==0 ){
76394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static const int sz = sizeof(IndexSample)*SQLITE_INDEX_SAMPLES;
76395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIdx->aSample = (IndexSample *)sqlite3DbMallocRaw(0, sz);
76396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pIdx->aSample==0 ){
76397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db->mallocFailed = 1;
76398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
76399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
76400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(pIdx->aSample, 0, sz);
76401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
76402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
76403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pIdx->aSample );
76404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- {
76405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- IndexSample *pSample = &pIdx->aSample[iSample];
76406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSample->eType = (u8)eType;
76407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){
76408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSample->u.r = sqlite3_column_double(pStmt, 2);
76409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( eType==SQLITE_TEXT || eType==SQLITE_BLOB ){
76410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *z = (const char *)(
76411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (eType==SQLITE_BLOB) ?
76412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_column_blob(pStmt, 2):
76413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_column_text(pStmt, 2)
76414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
76415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n = sqlite3_column_bytes(pStmt, 2);
76416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( n>24 ){
76417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- n = 24;
76418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
76419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSample->nByte = (u8)n;
76420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( n < 1){
76421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSample->u.z = 0;
76422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
76423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSample->u.z = sqlite3DbStrNDup(0, z, n);
76424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pSample->u.z==0 ){
76425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db->mallocFailed = 1;
76426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
76427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
76428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
76429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
76430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
76431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
76432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
76433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
76434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3_finalize(pStmt);
76435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
77112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Load the statistics from the sqlite_stat3 table. */
77113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
77114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
77115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = loadStat3(db, sInfo.zDatabase);
76436 77116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
76437 77117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
76438 77118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
76439 77119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_NOMEM ){
76440 77120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->mallocFailed = 1;
@@ -78875,12 +79555,12 @@
78875 79555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
78876 79556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
78877 79557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
78878 79558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
78879 79559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Reparse everything to update our internal data structures */
78880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp4(v, OP_ParseSchema, iDb, 0, 0,
78881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3MPrintf(db, "tbl_name='%q'",p->zName), P4_DYNAMIC);
79560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddParseSchemaOp(v, iDb,
79561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3MPrintf(db, "tbl_name='%q'", p->zName));
78882 79562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
78883 79563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
78884 79564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
78885 79565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Add the table to the in-memory representation of the database.
78886 79566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -79235,10 +79915,108 @@
79235 79915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iDestroyed = iLargest;
79236 79916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
79237 79917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
79238 79918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
79239 79919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
79920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
79921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
79922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Remove entries from the sqlite_stat1 and sqlite_stat2 tables
79923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** after a DROP INDEX or DROP TABLE command.
79924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
79925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void sqlite3ClearStatTables(
79926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Parse *pParse, /* The parsing context */
79927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iDb, /* The database number */
79928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zType, /* "idx" or "tbl" */
79929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zName /* Name of index or table */
79930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
79931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char *azStatTab[] = {
79932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "sqlite_stat1",
79933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "sqlite_stat2",
79934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "sqlite_stat3",
79935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
79936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
79937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zDbName = pParse->db->aDb[iDb].zName;
79938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<ArraySize(azStatTab); i++){
79939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( sqlite3FindTable(pParse->db, azStatTab[i], zDbName) ){
79940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3NestedParse(pParse,
79941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "DELETE FROM %Q.%s WHERE %s=%Q",
79942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zDbName, azStatTab[i], zType, zName
79943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
79944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
79945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
79946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
79947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
79948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
79949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Generate code to drop a table.
79950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
79951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3CodeDropTable(Parse *pParse, Table *pTab, int iDb, int isView){
79952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Vdbe *v;
79953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3 *db = pParse->db;
79954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Trigger *pTrigger;
79955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Db *pDb = &db->aDb[iDb];
79956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
79957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ v = sqlite3GetVdbe(pParse);
79958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( v!=0 );
79959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3BeginWriteOperation(pParse, 1, iDb);
79960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
79961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_VIRTUALTABLE
79962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( IsVirtual(pTab) ){
79963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp0(v, OP_VBegin);
79964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
79965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
79966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
79967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Drop all triggers associated with the table being dropped. Code
79968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is generated to remove entries from sqlite_master and/or
79969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite_temp_master if required.
79970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
79971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTrigger = sqlite3TriggerList(pParse, pTab);
79972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pTrigger ){
79973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pTrigger->pSchema==pTab->pSchema ||
79974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTrigger->pSchema==db->aDb[1].pSchema );
79975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DropTriggerPtr(pParse, pTrigger);
79976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTrigger = pTrigger->pNext;
79977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
79978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
79979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_OMIT_AUTOINCREMENT
79980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Remove any entries of the sqlite_sequence table associated with
79981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the table being dropped. This is done before the table is dropped
79982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** at the btree level, in case the sqlite_sequence table needs to
79983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** move as a result of the drop (can happen in auto-vacuum mode).
79984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
79985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pTab->tabFlags & TF_Autoincrement ){
79986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3NestedParse(pParse,
79987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "DELETE FROM %Q.sqlite_sequence WHERE name=%Q",
79988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDb->zName, pTab->zName
79989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
79990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
79991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
79992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
79993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Drop all SQLITE_MASTER table and index entries that refer to the
79994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** table. The program name loops through the master table and deletes
79995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** every row that refers to a table of the same name as the one being
79996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** dropped. Triggers are handled seperately because a trigger can be
79997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** created in the temp database that refers to a table in another
79998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** database.
79999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
80000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3NestedParse(pParse,
80001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'",
80002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDb->zName, SCHEMA_TABLE(iDb), pTab->zName);
80003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !isView && !IsVirtual(pTab) ){
80004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ destroyTable(pParse, pTab);
80005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
80006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
80007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Remove the table entry from SQLite's internal schema and modify
80008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the schema cookie.
80009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
80010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( IsVirtual(pTab) ){
80011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp4(v, OP_VDestroy, iDb, 0, 0, pTab->zName, 0);
80012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
80013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0);
80014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ChangeCookie(pParse, iDb);
80015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqliteViewResetAll(db, iDb);
80016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
80017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
79240 80018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
79241 80019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
79242 80020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine is called to do the work of a DROP TABLE statement.
79243 80021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** pName is the name of the table to be dropped.
79244 80022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -79304,11 +80082,11 @@
79304 80082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3AuthCheck(pParse, SQLITE_DELETE, pTab->zName, 0, zDb) ){
79305 80083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto exit_drop_table;
79306 80084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
79307 80085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
79308 80086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
79309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){
80087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pParse->nested && sqlite3StrNICmp(pTab->zName, "sqlite_", 7)==0 ){
79310 80088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ErrorMsg(pParse, "table %s may not be dropped", pTab->zName);
79311 80089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto exit_drop_table;
79312 80090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
79313 80091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
79314 80092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_VIEW
@@ -79328,79 +80106,15 @@
79328 80106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Generate code to remove the table from the master table
79329 80107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** on disk.
79330 80108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
79331 80109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
v = sqlite3GetVdbe(pParse);
79332 80110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( v ){
79333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Trigger *pTrigger;
79334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Db *pDb = &db->aDb[iDb];
79335 80111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BeginWriteOperation(pParse, 1, iDb);
79336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
79337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifndef SQLITE_OMIT_VIRTUALTABLE
79338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( IsVirtual(pTab) ){
79339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp0(v, OP_VBegin);
79340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
79341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
79342 80112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3FkDropTable(pParse, pName, pTab);
79343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
79344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Drop all triggers associated with the table being dropped. Code
79345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is generated to remove entries from sqlite_master and/or
79346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** sqlite_temp_master if required.
79347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
79348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTrigger = sqlite3TriggerList(pParse, pTab);
79349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( pTrigger ){
79350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pTrigger->pSchema==pTab->pSchema ||
79351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTrigger->pSchema==db->aDb[1].pSchema );
79352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3DropTriggerPtr(pParse, pTrigger);
79353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTrigger = pTrigger->pNext;
79354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
79355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
79356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifndef SQLITE_OMIT_AUTOINCREMENT
79357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Remove any entries of the sqlite_sequence table associated with
79358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the table being dropped. This is done before the table is dropped
79359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** at the btree level, in case the sqlite_sequence table needs to
79360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** move as a result of the drop (can happen in auto-vacuum mode).
79361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
79362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pTab->tabFlags & TF_Autoincrement ){
79363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3NestedParse(pParse,
79364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "DELETE FROM %s.sqlite_sequence WHERE name=%Q",
79365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pDb->zName, pTab->zName
79366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
79367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
79368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
79369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
79370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Drop all SQLITE_MASTER table and index entries that refer to the
79371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** table. The program name loops through the master table and deletes
79372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** every row that refers to a table of the same name as the one being
79373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** dropped. Triggers are handled seperately because a trigger can be
79374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** created in the temp database that refers to a table in another
79375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** database.
79376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
79377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3NestedParse(pParse,
79378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "DELETE FROM %Q.%s WHERE tbl_name=%Q and type!='trigger'",
79379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pDb->zName, SCHEMA_TABLE(iDb), pTab->zName);
79380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
79381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Drop any statistics from the sqlite_stat1 table, if it exists */
79382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sqlite3FindTable(db, "sqlite_stat1", db->aDb[iDb].zName) ){
79383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3NestedParse(pParse,
79384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "DELETE FROM %Q.sqlite_stat1 WHERE tbl=%Q", pDb->zName, pTab->zName
79385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
79386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
79387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
79388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !isView && !IsVirtual(pTab) ){
79389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- destroyTable(pParse, pTab);
79390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
79391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
79392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Remove the table entry from SQLite's internal schema and modify
79393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the schema cookie.
79394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
79395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( IsVirtual(pTab) ){
79396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp4(v, OP_VDestroy, iDb, 0, 0, pTab->zName, 0);
79397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
79398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp4(v, OP_DropTable, iDb, 0, 0, pTab->zName, 0);
79399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3ChangeCookie(pParse, iDb);
79400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
79401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqliteViewResetAll(db, iDb);
80113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3CodeDropTable(pParse, pTab, iDb, isView);
80114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ClearStatTables(pParse, iDb, "tbl", pTab->zName);
80115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
79402 80116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
79403 80117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
exit_drop_table:
79404 80118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3SrcListDelete(db, pName);
79405 80119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
79406 80120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -79843,24 +80557,24 @@
79843 80557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
79844 80558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nName = sqlite3Strlen30(zName);
79845 80559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nCol = pList->nExpr;
79846 80560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIndex = sqlite3DbMallocZero(db,
79847 80561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sizeof(Index) + /* Index structure */
80562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sizeof(tRowcnt)*(nCol+1) + /* Index.aiRowEst */
79848 80563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sizeof(int)*nCol + /* Index.aiColumn */
79849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sizeof(int)*(nCol+1) + /* Index.aiRowEst */
79850 80564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sizeof(char *)*nCol + /* Index.azColl */
79851 80565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sizeof(u8)*nCol + /* Index.aSortOrder */
79852 80566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nName + 1 + /* Index.zName */
79853 80567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nExtra /* Collation sequence names */
79854 80568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
79855 80569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db->mallocFailed ){
79856 80570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto exit_create_index;
79857 80571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
79858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIndex->azColl = (char**)(&pIndex[1]);
80572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIndex->aiRowEst = (tRowcnt*)(&pIndex[1]);
80573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIndex->azColl = (char**)(&pIndex->aiRowEst[nCol+1]);
79859 80574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIndex->aiColumn = (int *)(&pIndex->azColl[nCol]);
79860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIndex->aiRowEst = (unsigned *)(&pIndex->aiColumn[nCol]);
79861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIndex->aSortOrder = (u8 *)(&pIndex->aiRowEst[nCol+1]);
80575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIndex->aSortOrder = (u8 *)(&pIndex->aiColumn[nCol]);
79862 80576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIndex->zName = (char *)(&pIndex->aSortOrder[nCol]);
79863 80577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zExtra = (char *)(&pIndex->zName[nName+1]);
79864 80578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(pIndex->zName, zName, nName+1);
79865 80579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIndex->pTable = pTab;
79866 80580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIndex->nColumn = pList->nExpr;
@@ -80047,11 +80761,11 @@
80047 80761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pStart ){
80048 80762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pEnd!=0 );
80049 80763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* A named index with an explicit CREATE INDEX statement */
80050 80764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zStmt = sqlite3MPrintf(db, "CREATE%s INDEX %.*s",
80051 80765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
onError==OE_None ? "" : " UNIQUE",
80052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pEnd->z - pName->z + 1,
80766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (int)(pEnd->z - pName->z) + 1,
80053 80767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pName->z);
80054 80768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
80055 80769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* An automatic index created by a PRIMARY KEY or UNIQUE constraint */
80056 80770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* zStmt = sqlite3MPrintf(""); */
80057 80771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zStmt = 0;
@@ -80073,13 +80787,12 @@
80073 80787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to invalidate all pre-compiled statements.
80074 80788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
80075 80789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTblName ){
80076 80790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3RefillIndex(pParse, pIndex, iMem);
80077 80791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ChangeCookie(pParse, iDb);
80078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp4(v, OP_ParseSchema, iDb, 0, 0,
80079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName),
80080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- P4_DYNAMIC);
80792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddParseSchemaOp(v, iDb,
80793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3MPrintf(db, "name='%q' AND type='index'", pIndex->zName));
80081 80794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp1(v, OP_Expire, 0);
80082 80795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
80083 80796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
80084 80797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
80085 80798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* When adding an index to the list of indices for a table, make
@@ -80134,13 +80847,13 @@
80134 80847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Apart from that, we have little to go on besides intuition as to
80135 80848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** how aiRowEst[] should be initialized. The numbers generated here
80136 80849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** are based on typical values found in actual indices.
80137 80850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
80138 80851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3DefaultRowEst(Index *pIdx){
80139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned *a = pIdx->aiRowEst;
80852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt *a = pIdx->aiRowEst;
80140 80853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
80141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned n;
80854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt n;
80142 80855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( a!=0 );
80143 80856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
a[0] = pIdx->pTable->nRowEst;
80144 80857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( a[0]<10 ) a[0] = 10;
80145 80858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
n = 10;
80146 80859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=1; i<=pIdx->nColumn; i++){
@@ -80206,19 +80919,13 @@
80206 80919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
v = sqlite3GetVdbe(pParse);
80207 80920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( v ){
80208 80921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3BeginWriteOperation(pParse, 1, iDb);
80209 80922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3NestedParse(pParse,
80210 80923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"DELETE FROM %Q.%s WHERE name=%Q AND type='index'",
80211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db->aDb[iDb].zName, SCHEMA_TABLE(iDb),
80212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIndex->zName
80213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
80214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( sqlite3FindTable(db, "sqlite_stat1", db->aDb[iDb].zName) ){
80215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3NestedParse(pParse,
80216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "DELETE FROM %Q.sqlite_stat1 WHERE idx=%Q",
80217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db->aDb[iDb].zName, pIndex->zName
80218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
80219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
80924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ db->aDb[iDb].zName, SCHEMA_TABLE(iDb), pIndex->zName
80925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
80926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ClearStatTables(pParse, iDb, "idx", pIndex->zName);
80220 80927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ChangeCookie(pParse, iDb);
80221 80928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
destroyRootPage(pParse, pIndex->tnum, iDb);
80222 80929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp4(v, OP_DropIndex, iDb, 0, 0, pIndex->zName, 0);
80223 80930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
80224 80931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -81843,11 +82550,13 @@
81843 82550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int regRowid; /* Actual register containing rowids */
81844 82551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
81845 82552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Collect rowids of every row to be deleted.
81846 82553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
81847 82554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Null, 0, iRowSet);
81848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere,0,WHERE_DUPLICATES_OK);
82555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWInfo = sqlite3WhereBegin(
82556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pParse, pTabList, pWhere, 0, 0, WHERE_DUPLICATES_OK
82557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
81849 82558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pWInfo==0 ) goto delete_from_cleanup;
81850 82559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
regRowid = sqlite3ExprCodeGetColumn(pParse, pTab, -1, iCur, iRowid);
81851 82560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_RowSetAdd, iRowSet, regRowid);
81852 82561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db->flags & SQLITE_CountRows ){
81853 82562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_AddImm, memCnt, 1);
@@ -82108,12 +82817,18 @@
82108 82817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp3(v, OP_Column, iCur, idx, regBase+j);
82109 82818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ColumnDefault(v, pTab, idx, -1);
82110 82819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
82111 82820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
82112 82821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( doMakeRec ){
82822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zAff;
82823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pTab->pSelect || (pParse->db->flags & SQLITE_IdxRealAsInt)!=0 ){
82824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zAff = 0;
82825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
82826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zAff = sqlite3IndexAffinityStr(v, pIdx);
82827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
82113 82828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp3(v, OP_MakeRecord, regBase, nCol+1, regOut);
82114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeChangeP4(v, -1, sqlite3IndexAffinityStr(v, pIdx), P4_TRANSIENT);
82829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP4(v, -1, zAff, P4_TRANSIENT);
82115 82830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
82116 82831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ReleaseTempRange(pParse, regBase, nCol+1);
82117 82832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return regBase;
82118 82833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
82119 82834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -82621,14 +83336,14 @@
82621 83336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** character is exactly one byte in size. Also, all characters are
82622 83337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** able to participate in upper-case-to-lower-case mappings in EBCDIC
82623 83338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** whereas only characters less than 0x80 do in ASCII.
82624 83339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
82625 83340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(SQLITE_EBCDIC)
82626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # define sqlite3Utf8Read(A,C) (*(A++))
82627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
83341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3Utf8Read(A,C) (*(A++))
83342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define GlogUpperToLower(A) A = sqlite3UpperToLower[A]
82628 83343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
82629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # define GlogUpperToLower(A) if( A<0x80 ){ A = sqlite3UpperToLower[A]; }
83344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define GlogUpperToLower(A) if( !((A)&~0x7f) ){ A = sqlite3UpperToLower[A]; }
82630 83345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
82631 83346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
82632 83347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static const struct compareInfo globInfo = { '*', '?', '[', 0 };
82633 83348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The correct SQL-92 behavior is for the LIKE operator to ignore
82634 83349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** case. Thus 'a' LIKE 'A' would be true. */
@@ -82667,13 +83382,13 @@
82667 83382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
82668 83383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int patternCompare(
82669 83384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const u8 *zPattern, /* The glob pattern */
82670 83385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const u8 *zString, /* The string to compare against the glob */
82671 83386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const struct compareInfo *pInfo, /* Information about how to do the compare */
82672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const int esc /* The escape character */
83387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 esc /* The escape character */
82673 83388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
82674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int c, c2;
83389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 c, c2;
82675 83390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int invert;
82676 83391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int seen;
82677 83392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 matchOne = pInfo->matchOne;
82678 83393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 matchAll = pInfo->matchAll;
82679 83394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 matchSet = pInfo->matchSet;
@@ -82723,11 +83438,11 @@
82723 83438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( !prevEscape && c==matchOne ){
82724 83439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3Utf8Read(zString, &zString)==0 ){
82725 83440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
82726 83441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
82727 83442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( c==matchSet ){
82728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int prior_c = 0;
83443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 prior_c = 0;
82729 83444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( esc==0 ); /* This only occurs for GLOB, not LIKE */
82730 83445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
seen = 0;
82731 83446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
invert = 0;
82732 83447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
c = sqlite3Utf8Read(zString, &zString);
82733 83448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( c==0 ) return 0;
@@ -82799,11 +83514,11 @@
82799 83514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_context *context,
82800 83515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int argc,
82801 83516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_value **argv
82802 83517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
82803 83518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const unsigned char *zA, *zB;
82804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int escape = 0;
83519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 escape = 0;
82805 83520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nPat;
82806 83521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3 *db = sqlite3_context_db_handle(context);
82807 83522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
82808 83523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zB = sqlite3_value_text(argv[0]);
82809 83524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zA = sqlite3_value_text(argv[1]);
@@ -84110,17 +84825,29 @@
84110 84825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
84111 84826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
84112 84827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If the parent table is the same as the child table, and we are about
84113 84828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to increment the constraint-counter (i.e. this is an INSERT operation),
84114 84829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** then check if the row being inserted matches itself. If so, do not
84115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** increment the constraint-counter. */
84830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** increment the constraint-counter.
84831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
84832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If any of the parent-key values are NULL, then the row cannot match
84833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** itself. So set JUMPIFNULL to make sure we do the OP_Found if any
84834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the parent-key values are NULL (at this point it is known that
84835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** none of the child key values are).
84836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
84116 84837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTab==pFKey->pFrom && nIncr==1 ){
84117 84838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iJump = sqlite3VdbeCurrentAddr(v) + nCol + 1;
84118 84839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<nCol; i++){
84119 84840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iChild = aiCol[i]+1+regData;
84120 84841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iParent = pIdx->aiColumn[i]+1+regData;
84842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( aiCol[i]!=pTab->iPKey );
84843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pIdx->aiColumn[i]==pTab->iPKey ){
84844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The parent key is a composite key that includes the IPK column */
84845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iParent = regData;
84846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
84121 84847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp3(v, OP_Ne, iChild, iJump, iParent);
84848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP5(v, SQLITE_JUMPIFNULL);
84122 84849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
84123 84850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Goto, 0, iOk);
84124 84851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
84125 84852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
84126 84853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp3(v, OP_MakeRecord, regTemp, nCol, regRec);
@@ -84272,11 +84999,11 @@
84272 84999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
84273 85000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Create VDBE to loop through the entries in pSrc that match the WHERE
84274 85001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** clause. If the constraint is not deferred, throw an exception for
84275 85002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** each row found. Otherwise, for deferred constraints, increment the
84276 85003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** deferred constraint counter by nIncr for each row selected. */
84277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0);
85004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWInfo = sqlite3WhereBegin(pParse, pSrc, pWhere, 0, 0, 0);
84278 85005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nIncr>0 && pFKey->isDeferred==0 ){
84279 85006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ParseToplevel(pParse)->mayAbort = 1;
84280 85007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
84281 85008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_FkCounter, pFKey->isDeferred, nIncr);
84282 85009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pWInfo ){
@@ -87139,10 +87866,13 @@
87139 87866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*strnicmp)(const char*,const char*,int);
87140 87867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*unlock_notify)(sqlite3*,void(*)(void**,int),void*);
87141 87868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*wal_autocheckpoint)(sqlite3*,int);
87142 87869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int (*wal_checkpoint)(sqlite3*,const char*);
87143 87870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *(*wal_hook)(sqlite3*,int(*)(void*,sqlite3*,const char*,int),void*);
87871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*blob_reopen)(sqlite3_blob*,sqlite3_int64);
87872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*vtab_config)(sqlite3*,int op,...);
87873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*vtab_on_conflict)(sqlite3*);
87144 87874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
87145 87875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
87146 87876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
87147 87877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The following macros redefine the API routines so that they are
87148 87878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** redirected throught the global sqlite3_api structure.
@@ -87339,10 +88069,13 @@
87339 88069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define sqlite3_strnicmp sqlite3_api->strnicmp
87340 88070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define sqlite3_unlock_notify sqlite3_api->unlock_notify
87341 88071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define sqlite3_wal_autocheckpoint sqlite3_api->wal_autocheckpoint
87342 88072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define sqlite3_wal_checkpoint sqlite3_api->wal_checkpoint
87343 88073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define sqlite3_wal_hook sqlite3_api->wal_hook
88074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define sqlite3_blob_reopen sqlite3_api->blob_reopen
88075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define sqlite3_vtab_config sqlite3_api->vtab_config
88076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define sqlite3_vtab_on_conflict sqlite3_api->vtab_on_conflict
87344 88077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_CORE */
87345 88078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
87346 88079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_EXTENSION_INIT1 const sqlite3_api_routines *sqlite3_api = 0;
87347 88080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_EXTENSION_INIT2(v) sqlite3_api = v;
87348 88081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -87413,10 +88146,12 @@
87413 88146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
87414 88147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_OMIT_VIRTUALTABLE
87415 88148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define sqlite3_create_module 0
87416 88149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define sqlite3_create_module_v2 0
87417 88150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define sqlite3_declare_vtab 0
88151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3_vtab_config 0
88152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define sqlite3_vtab_on_conflict 0
87418 88153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
87419 88154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
87420 88155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_OMIT_SHARED_CACHE
87421 88156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define sqlite3_enable_shared_cache 0
87422 88157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
@@ -87436,10 +88171,11 @@
87436 88171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define sqlite3_blob_bytes 0
87437 88172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define sqlite3_blob_close 0
87438 88173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define sqlite3_blob_open 0
87439 88174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define sqlite3_blob_read 0
87440 88175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define sqlite3_blob_write 0
88176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define sqlite3_blob_reopen 0
87441 88177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
87442 88178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
87443 88179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
87444 88180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The following structure contains pointers to all SQLite API routines.
87445 88181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A pointer to this structure is passed into extensions when they are
@@ -87701,10 +88437,13 @@
87701 88437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
87702 88438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0,
87703 88439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0,
87704 88440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
0,
87705 88441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
88442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_blob_reopen,
88443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_vtab_config,
88444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_vtab_on_conflict,
87706 88445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
87707 88446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
87708 88447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
87709 88448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Attempt to load an SQLite extension library contained in the file
87710 88449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** zFile. The entry point is zProc. zProc may be 0 in which case a
@@ -94090,10 +94829,11 @@
94090 94829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pHaving; /* The HAVING clause. May be NULL */
94091 94830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isDistinct; /* True if the DISTINCT keyword is present */
94092 94831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int distinct; /* Table to use for the distinct set */
94093 94832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = 1; /* Value to return from this function */
94094 94833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int addrSortIndex; /* Address of an OP_OpenEphemeral instruction */
94834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int addrDistinctIndex; /* Address of an OP_OpenEphemeral instruction */
94095 94835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
AggInfo sAggInfo; /* Information used by aggregate queries */
94096 94836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iEnd; /* Address of the end of the query */
94097 94837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3 *db; /* The database connection */
94098 94838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
94099 94839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_EXPLAIN
@@ -94216,20 +94956,10 @@
94216 94956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
explainSetInteger(pParse->iSelectId, iRestoreSelectId);
94217 94957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
94218 94958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
94219 94959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
94220 94960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
94221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If possible, rewrite the query to use GROUP BY instead of DISTINCT.
94222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** GROUP BY might use an index, DISTINCT never does.
94223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
94224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( p->pGroupBy==0 || (p->selFlags & SF_Aggregate)!=0 );
94225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct ){
94226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pGroupBy = sqlite3ExprListDup(db, p->pEList, 0);
94227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pGroupBy = p->pGroupBy;
94228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->selFlags &= ~SF_Distinct;
94229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
94230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
94231 94961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there is both a GROUP BY and an ORDER BY clause and they are
94232 94962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** identical, then disable the ORDER BY clause since the GROUP BY
94233 94963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** will cause elements to come out in the correct order. This is
94234 94964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** an optimization - the correct answer should result regardless.
94235 94965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Use the SQLITE_GroupByOrder flag with SQLITE_TESTCTRL_OPTIMIZER
@@ -94237,10 +94967,34 @@
94237 94967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
94238 94968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3ExprListCompare(p->pGroupBy, pOrderBy)==0
94239 94969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& (db->flags & SQLITE_GroupByOrder)==0 ){
94240 94970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pOrderBy = 0;
94241 94971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
94972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
94973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the query is DISTINCT with an ORDER BY but is not an aggregate, and
94974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if the select-list is the same as the ORDER BY list, then this query
94975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** can be rewritten as a GROUP BY. In other words, this:
94976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
94977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SELECT DISTINCT xyz FROM ... ORDER BY xyz
94978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
94979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is transformed to:
94980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
94981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SELECT xyz FROM ... GROUP BY xyz
94982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
94983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The second form is preferred as a single index (or temp-table) may be
94984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** used for both the ORDER BY and DISTINCT processing. As originally
94985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** written the query must use a temp-table for at least one of the ORDER
94986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** BY and DISTINCT, and an index or separate temp-table for the other.
94987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
94988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (p->selFlags & (SF_Distinct|SF_Aggregate))==SF_Distinct
94989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && sqlite3ExprListCompare(pOrderBy, p->pEList)==0
94990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
94991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->selFlags &= ~SF_Distinct;
94992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pGroupBy = sqlite3ExprListDup(db, p->pEList, 0);
94993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pGroupBy = p->pGroupBy;
94994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOrderBy = 0;
94995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
94242 94996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
94243 94997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there is an ORDER BY clause, then this sorting
94244 94998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** index might end up being unused if the data can be
94245 94999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** extracted in pre-sorted order. If that is the case, then the
94246 95000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** OP_OpenEphemeral instruction will be changed to an OP_Noop once
@@ -94273,26 +95027,25 @@
94273 95027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
94274 95028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Open a virtual index to use for the distinct set.
94275 95029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
94276 95030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->selFlags & SF_Distinct ){
94277 95031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
KeyInfo *pKeyInfo;
94278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( isAgg || pGroupBy );
94279 95032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
distinct = pParse->nTab++;
94280 95033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pKeyInfo = keyInfoFromExprList(pParse, p->pEList);
94281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp4(v, OP_OpenEphemeral, distinct, 0, 0,
94282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (char*)pKeyInfo, P4_KEYINFO_HANDOFF);
95034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ addrDistinctIndex = sqlite3VdbeAddOp4(v, OP_OpenEphemeral, distinct, 0, 0,
95035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (char*)pKeyInfo, P4_KEYINFO_HANDOFF);
94283 95036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeChangeP5(v, BTREE_UNORDERED);
94284 95037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
94285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- distinct = -1;
95038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ distinct = addrDistinctIndex = -1;
94286 95039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
94287 95040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
94288 95041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Aggregate and non-aggregate queries are handled differently */
94289 95042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !isAgg && pGroupBy==0 ){
94290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* This case is for non-aggregate queries
94291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Begin the database scan
94292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
94293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pOrderBy, 0);
95043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ExprList *pDist = (isDistinct ? p->pEList : 0);
95044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
95045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Begin the database scan. */
95046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pOrderBy, pDist, 0);
94294 95047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pWInfo==0 ) goto select_end;
94295 95048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pWInfo->nRowOut < p->nSelectRow ) p->nSelectRow = pWInfo->nRowOut;
94296 95049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
94297 95050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If sorting index that was created by a prior OP_OpenEphemeral
94298 95051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** instruction ended up not being needed, then change the OP_OpenEphemeral
@@ -94301,14 +95054,56 @@
94301 95054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( addrSortIndex>=0 && pOrderBy==0 ){
94302 95055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeChangeToNoop(v, addrSortIndex, 1);
94303 95056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->addrOpenEphm[2] = -1;
94304 95057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
94305 95058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
94306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Use the standard inner loop
94307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
94308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert(!isDistinct);
94309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- selectInnerLoop(pParse, p, pEList, 0, 0, pOrderBy, -1, pDest,
95059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWInfo->eDistinct ){
95060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ VdbeOp *pOp; /* No longer required OpenEphemeral instr. */
95061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
95062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( addrDistinctIndex>0 );
95063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOp = sqlite3VdbeGetOp(v, addrDistinctIndex);
95064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
95065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( isDistinct );
95066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWInfo->eDistinct==WHERE_DISTINCT_ORDERED
95067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || pWInfo->eDistinct==WHERE_DISTINCT_UNIQUE
95068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
95069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ distinct = -1;
95070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pWInfo->eDistinct==WHERE_DISTINCT_ORDERED ){
95071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iJump;
95072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iExpr;
95073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iFlag = ++pParse->nMem;
95074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iBase = pParse->nMem+1;
95075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iBase2 = iBase + pEList->nExpr;
95076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pParse->nMem += (pEList->nExpr*2);
95077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
95078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Change the OP_OpenEphemeral coded earlier to an OP_Integer. The
95079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** OP_Integer initializes the "first row" flag. */
95080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOp->opcode = OP_Integer;
95081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOp->p1 = 1;
95082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOp->p2 = iFlag;
95083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
95084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ExprCodeExprList(pParse, pEList, iBase, 1);
95085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iJump = sqlite3VdbeCurrentAddr(v) + 1 + pEList->nExpr + 1 + 1;
95086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_If, iFlag, iJump-1);
95087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iExpr=0; iExpr<pEList->nExpr; iExpr++){
95088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CollSeq *pColl = sqlite3ExprCollSeq(pParse, pEList->a[iExpr].pExpr);
95089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_Ne, iBase+iExpr, iJump, iBase2+iExpr);
95090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP4(v, -1, (const char *)pColl, P4_COLLSEQ);
95091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeChangeP5(v, SQLITE_NULLEQ);
95092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
95093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_Goto, 0, pWInfo->iContinue);
95094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
95095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp2(v, OP_Integer, 0, iFlag);
95096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( sqlite3VdbeCurrentAddr(v)==iJump );
95097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddOp3(v, OP_Move, iBase, iBase2, pEList->nExpr);
95098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
95099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pOp->opcode = OP_Noop;
95100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
95101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
95102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
95103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Use the standard inner loop. */
95104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ selectInnerLoop(pParse, p, pEList, 0, 0, pOrderBy, distinct, pDest,
94310 95105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pWInfo->iContinue, pWInfo->iBreak);
94311 95106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
94312 95107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* End the database scan loop.
94313 95108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
94314 95109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3WhereEnd(pWInfo);
@@ -94414,11 +95209,11 @@
94414 95209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This might involve two separate loops with an OP_Sort in between, or
94415 95210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** it might be a single loop that uses an index to extract information
94416 95211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** in the right order to begin with.
94417 95212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
94418 95213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Gosub, regReset, addrReset);
94419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pGroupBy, 0);
95214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pGroupBy, 0, 0);
94420 95215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pWInfo==0 ) goto select_end;
94421 95216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pGroupBy==0 ){
94422 95217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The optimizer is able to deliver rows in group by order so
94423 95218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** we do not have to sort. The OP_OpenEphemeral table will be
94424 95219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** cancelled later because we still need to use the pKeyInfo
@@ -94676,11 +95471,11 @@
94676 95471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* This case runs if the aggregate has no GROUP BY clause. The
94677 95472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** processing is much simpler since there is only a single row
94678 95473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of output.
94679 95474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
94680 95475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
resetAccumulator(pParse, &sAggInfo);
94681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pMinMax, flag);
95476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere, &pMinMax, 0, flag);
94682 95477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pWInfo==0 ){
94683 95478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ExprListDelete(db, pDel);
94684 95479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto select_end;
94685 95480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
94686 95481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
updateAccumulator(pParse, &sAggInfo);
@@ -95152,19 +95947,32 @@
95152 95947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iDb = sqlite3TwoPartName(pParse, pName1, pName2, &pName);
95153 95948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iDb<0 ){
95154 95949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto trigger_cleanup;
95155 95950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
95156 95951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
95952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pTableName || db->mallocFailed ){
95953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto trigger_cleanup;
95954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
95955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
95956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* A long-standing parser bug is that this syntax was allowed:
95957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
95958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** CREATE TRIGGER attached.demo AFTER INSERT ON attached.tab ....
95959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ^^^^^^^^
95960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
95961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** To maintain backwards compatibility, ignore the database
95962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** name on pTableName if we are reparsing our of SQLITE_MASTER.
95963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
95964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db->init.busy && iDb!=1 ){
95965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3DbFree(db, pTableName->a[0].zDatabase);
95966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTableName->a[0].zDatabase = 0;
95967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
95157 95968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
95158 95969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If the trigger name was unqualified, and the table is a temp table,
95159 95970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** then set iDb to 1 to create the trigger in the temporary database.
95160 95971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If sqlite3SrcListLookup() returns 0, indicating the table does not
95161 95972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** exist, the error is caught by the block below.
95162 95973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
95163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !pTableName || db->mallocFailed ){
95164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto trigger_cleanup;
95165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
95166 95974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTab = sqlite3SrcListLookup(pParse, pTableName);
95167 95975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db->init.busy==0 && pName2->n==0 && pTab
95168 95976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& pTab->pSchema==db->aDb[1].pSchema ){
95169 95977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iDb = 1;
95170 95978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -95336,13 +96144,12 @@
95336 96144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"INSERT INTO %Q.%s VALUES('trigger',%Q,%Q,0,'CREATE TRIGGER %q')",
95337 96145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db->aDb[iDb].zName, SCHEMA_TABLE(iDb), zName,
95338 96146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTrig->table, z);
95339 96147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(db, z);
95340 96148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ChangeCookie(pParse, iDb);
95341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp4(v, OP_ParseSchema, iDb, 0, 0, sqlite3MPrintf(
95342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- db, "type='trigger' AND name='%q'", zName), P4_DYNAMIC
95343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
96149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddParseSchemaOp(v, iDb,
96150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3MPrintf(db, "type='trigger' AND name='%q'", zName));
95344 96151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
95345 96152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
95346 96153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db->init.busy ){
95347 96154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Trigger *pLink = pTrig;
95348 96155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Hash *pHash = &db->aDb[iDb].pSchema->trigHash;
@@ -96392,11 +97199,11 @@
96392 97199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aRegIdx = sqlite3DbMallocRaw(db, sizeof(Index*) * nIdx );
96393 97200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( aRegIdx==0 ) goto update_cleanup;
96394 97201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
96395 97202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(j=0, pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext, j++){
96396 97203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int reg;
96397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( chngRowid ){
97204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( hasFK || chngRowid ){
96398 97205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
reg = ++pParse->nMem;
96399 97206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
96400 97207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
reg = 0;
96401 97208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<pIdx->nColumn; i++){
96402 97209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( aXRef[pIdx->aiColumn[i]]>=0 ){
@@ -96459,11 +97266,13 @@
96459 97266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
96460 97267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
96461 97268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Begin the database scan
96462 97269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
96463 97270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Null, 0, regOldRowid);
96464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pWInfo = sqlite3WhereBegin(pParse, pTabList, pWhere,0, WHERE_ONEPASS_DESIRED);
97271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWInfo = sqlite3WhereBegin(
97272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pParse, pTabList, pWhere, 0, 0, WHERE_ONEPASS_DESIRED
97273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
96465 97274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pWInfo==0 ) goto update_cleanup;
96466 97275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
okOnePass = pWInfo->okOnePass;
96467 97276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
96468 97277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Remember the rowid of every item to be updated.
96469 97278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -97547,11 +98356,11 @@
97547 98356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
v = sqlite3GetVdbe(pParse);
97548 98357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ChangeCookie(pParse, iDb);
97549 98358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
97550 98359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp2(v, OP_Expire, 0, 0);
97551 98360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zWhere = sqlite3MPrintf(db, "name='%q' AND type='table'", pTab->zName);
97552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3VdbeAddOp4(v, OP_ParseSchema, iDb, 0, 0, zWhere, P4_DYNAMIC);
98361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3VdbeAddParseSchemaOp(v, iDb, zWhere);
97553 98362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3VdbeAddOp4(v, OP_VCreate, iDb, 0, 0,
97554 98363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTab->zName, sqlite3Strlen30(pTab->zName) + 1);
97555 98364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
97556 98365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
97557 98366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If we are rereading the sqlite_master table create the in-memory
@@ -98350,11 +99159,11 @@
98350 99159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define TERM_CODED 0x04 /* This term is already coded */
98351 99160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define TERM_COPIED 0x08 /* Has a child */
98352 99161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define TERM_ORINFO 0x10 /* Need to free the WhereTerm.u.pOrInfo object */
98353 99162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define TERM_ANDINFO 0x20 /* Need to free the WhereTerm.u.pAndInfo obj */
98354 99163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define TERM_OR_OK 0x40 /* Used during OR-clause processing */
98355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
99164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
98356 99165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define TERM_VNULL 0x80 /* Manufactured x>NULL or x<=NULL term */
98357 99166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
98358 99167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define TERM_VNULL 0x00 /* Disabled if not using stat2 */
98359 99168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
98360 99169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -98485,10 +99294,11 @@
98485 99294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define WHERE_REVERSE 0x02000000 /* Scan in reverse order */
98486 99295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define WHERE_UNIQUE 0x04000000 /* Selects no more than one row */
98487 99296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define WHERE_VIRTUALTABLE 0x08000000 /* Use virtual-table processing */
98488 99297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define WHERE_MULTI_OR 0x10000000 /* OR using multiple indices */
98489 99298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define WHERE_TEMP_INDEX 0x20000000 /* Uses an ephemeral index */
99299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define WHERE_DISTINCT 0x40000000 /* Correct order for DISTINCT */
98490 99300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
98491 99301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
98492 99302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Initialize a preallocated WhereClause structure.
98493 99303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
98494 99304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void whereClauseInit(
@@ -99563,11 +100373,11 @@
99563 100373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNewTerm->prereqAll = pTerm->prereqAll;
99564 100374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99565 100375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99566 100376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_OMIT_VIRTUALTABLE */
99567 100377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
99568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
100378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
99569 100379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* When sqlite_stat2 histogram data is available an operator of the
99570 100380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** form "x IS NOT NULL" can sometimes be evaluated more efficiently
99571 100381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** as "x>NULL" if x is not an INTEGER PRIMARY KEY. So construct a
99572 100382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** virtual term of that form.
99573 100383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -99602,11 +100412,11 @@
99602 100412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTerm->nChild = 1;
99603 100413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTerm->wtFlags |= TERM_COPIED;
99604 100414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNewTerm->prereqAll = pTerm->prereqAll;
99605 100415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99606 100416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* SQLITE_ENABLE_STAT2 */
100417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_ENABLE_STAT */
99608 100418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
99609 100419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Prevent ON clause terms of a LEFT JOIN from being used to drive
99610 100420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** an index for tables to the left of the join.
99611 100421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
99612 100422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTerm->prereqRight |= extraRight;
@@ -99629,10 +100439,166 @@
99629 100439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99630 100440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99631 100441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
99632 100442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99633 100443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
100445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function searches the expression list passed as the second argument
100446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for an expression of type TK_COLUMN that refers to the same column and
100447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** uses the same collation sequence as the iCol'th column of index pIdx.
100448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Argument iBase is the cursor number used for the table that pIdx refers
100449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to.
100450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
100451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If such an expression is found, its index in pList->a[] is returned. If
100452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** no expression is found, -1 is returned.
100453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
100454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int findIndexCol(
100455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Parse *pParse, /* Parse context */
100456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ExprList *pList, /* Expression list to search */
100457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iBase, /* Cursor for table associated with pIdx */
100458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Index *pIdx, /* Index to match column of */
100459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iCol /* Column of index to match */
100460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
100461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
100462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zColl = pIdx->azColl[iCol];
100463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<pList->nExpr; i++){
100465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *p = pList->a[i].pExpr;
100466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->op==TK_COLUMN
100467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && p->iColumn==pIdx->aiColumn[iCol]
100468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && p->iTable==iBase
100469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
100470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CollSeq *pColl = sqlite3ExprCollSeq(pParse, p);
100471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ALWAYS(pColl) && 0==sqlite3StrICmp(pColl->zName, zColl) ){
100472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return i;
100473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return -1;
100478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
100481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This routine determines if pIdx can be used to assist in processing a
100482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** DISTINCT qualifier. In other words, it tests whether or not using this
100483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** index for the outer loop guarantees that rows with equal values for
100484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** all expressions in the pDistinct list are delivered grouped together.
100485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
100486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** For example, the query
100487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
100488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SELECT DISTINCT a, b, c FROM tbl WHERE a = ?
100489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
100490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** can benefit from any index on columns "b" and "c".
100491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
100492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int isDistinctIndex(
100493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Parse *pParse, /* Parsing context */
100494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WhereClause *pWC, /* The WHERE clause */
100495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Index *pIdx, /* The index being considered */
100496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int base, /* Cursor number for the table pIdx is on */
100497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ExprList *pDistinct, /* The DISTINCT expressions */
100498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nEqCol /* Number of index columns with == */
100499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
100500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Bitmask mask = 0; /* Mask of unaccounted for pDistinct exprs */
100501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Iterator variable */
100502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pIdx->zName==0 || pDistinct==0 || pDistinct->nExpr>=BMS ) return 0;
100504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ testcase( pDistinct->nExpr==BMS-1 );
100505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Loop through all the expressions in the distinct list. If any of them
100507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are not simple column references, return early. Otherwise, test if the
100508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WHERE clause contains a "col=X" clause. If it does, the expression
100509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** can be ignored. If it does not, and the column does not belong to the
100510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** same table as index pIdx, return early. Finally, if there is no
100511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** matching "col=X" expression and the column is on the same table as pIdx,
100512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** set the corresponding bit in variable mask.
100513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
100514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<pDistinct->nExpr; i++){
100515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WhereTerm *pTerm;
100516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *p = pDistinct->a[i].pExpr;
100517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->op!=TK_COLUMN ) return 0;
100518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTerm = findTerm(pWC, p->iTable, p->iColumn, ~(Bitmask)0, WO_EQ, 0);
100519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pTerm ){
100520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *pX = pTerm->pExpr;
100521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CollSeq *p1 = sqlite3BinaryCompareCollSeq(pParse, pX->pLeft, pX->pRight);
100522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ CollSeq *p2 = sqlite3ExprCollSeq(pParse, p);
100523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p1==p2 ) continue;
100524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->iTable!=base ) return 0;
100526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mask |= (((Bitmask)1) << i);
100527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=nEqCol; mask && i<pIdx->nColumn; i++){
100530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iExpr = findIndexCol(pParse, pDistinct, base, pIdx, i);
100531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iExpr<0 ) break;
100532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ mask &= ~(((Bitmask)1) << iExpr);
100533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (mask==0);
100536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
100540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return true if the DISTINCT expression-list passed as the third argument
100541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is redundant. A DISTINCT list is redundant if the database contains a
100542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** UNIQUE index that guarantees that the result of the query will be distinct
100543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** anyway.
100544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
100545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int isDistinctRedundant(
100546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Parse *pParse,
100547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SrcList *pTabList,
100548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WhereClause *pWC,
100549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ExprList *pDistinct
100550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
100551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Table *pTab;
100552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Index *pIdx;
100553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
100554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iBase;
100555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If there is more than one table or sub-select in the FROM clause of
100557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this query, then it will not be possible to show that the DISTINCT
100558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** clause is redundant. */
100559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pTabList->nSrc!=1 ) return 0;
100560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iBase = pTabList->a[0].iCursor;
100561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTab = pTabList->a[0].pTab;
100562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If any of the expressions is an IPK column on table iBase, then return
100564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** true. Note: The (p->iTable==iBase) part of this test may be false if the
100565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** current SELECT is a correlated sub-query.
100566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
100567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<pDistinct->nExpr; i++){
100568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Expr *p = pDistinct->a[i].pExpr;
100569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->op==TK_COLUMN && p->iTable==iBase && p->iColumn<0 ) return 1;
100570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Loop through all indices on the table, checking each to see if it makes
100573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the DISTINCT qualifier redundant. It does so if:
100574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
100575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1. The index is itself UNIQUE, and
100576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
100577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2. All of the columns in the index are either part of the pDistinct
100578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** list, or else the WHERE clause contains a term of the form "col=X",
100579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** where X is a constant value. The collation sequences of the
100580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** comparison and select-list expressions must match those of the index.
100581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
100582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pIdx=pTab->pIndex; pIdx; pIdx=pIdx->pNext){
100583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pIdx->onError==OE_None ) continue;
100584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<pIdx->nColumn; i++){
100585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iCol = pIdx->aiColumn[i];
100586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( 0==findTerm(pWC, iBase, iCol, ~(Bitmask)0, WO_EQ, pIdx)
100587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && 0>findIndexCol(pParse, pDistinct, iBase, pIdx, i)
100588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
100589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
100590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i==pIdx->nColumn ){
100593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This index implies that the DISTINCT qualifier is redundant. */
100594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1;
100595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
100599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
99634 100600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
99635 100601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
99636 100602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This routine decides if pIdx can be used to satisfy the ORDER BY
99637 100603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** clause. If it can, it returns 1. If pIdx cannot satisfy the
99638 100604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ORDER BY clause, this routine returns 0.
@@ -99665,11 +100631,14 @@
99665 100631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int sortOrder = 0; /* XOR of index and ORDER BY sort direction */
99666 100632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nTerm; /* Number of ORDER BY terms */
99667 100633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct ExprList_item *pTerm; /* A term of the ORDER BY clause */
99668 100634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3 *db = pParse->db;
99669 100635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
99670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pOrderBy!=0 );
100636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pOrderBy ) return 0;
100637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( wsFlags & WHERE_COLUMN_IN ) return 0;
100638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pIdx->bUnordered ) return 0;
100639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
99671 100640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nTerm = pOrderBy->nExpr;
99672 100641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( nTerm>0 );
99673 100642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
99674 100643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Argument pIdx must either point to a 'real' named index structure,
99675 100644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** or an index structure allocated on the stack by bestBtreeIndex() to
@@ -99978,10 +100947,14 @@
99978 100947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
double costTempIdx; /* per-query cost of the transient index */
99979 100948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereTerm *pTerm; /* A single term of the WHERE clause */
99980 100949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereTerm *pWCEnd; /* End of pWC->a[] */
99981 100950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Table *pTable; /* Table tht might be indexed */
99982 100951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pParse->nQueryLoop<=(double)1 ){
100953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* There is no point in building an automatic index for a single scan */
100954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
100955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
99983 100956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (pParse->db->flags & SQLITE_AutoIndex)==0 ){
99984 100957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Automatic indices are disabled at run-time */
99985 100958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
99986 100959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99987 100960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (pCost->plan.wsFlags & WHERE_NOT_FULLSCAN)!=0 ){
@@ -99989,10 +100962,14 @@
99989 100962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
99990 100963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99991 100964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pSrc->notIndexed ){
99992 100965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The NOT INDEXED clause appears in the SQL. */
99993 100966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return;
100967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pSrc->isCorrelated ){
100969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The source is a correlated sub-query. No point in indexing it. */
100970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
99994 100971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
99995 100972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
99996 100973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pParse->nQueryLoop >= (double)1 );
99997 100974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTable = pSrc->pTab;
99998 100975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nTableRow = pTable->nRowEst;
@@ -100206,10 +101183,11 @@
100206 101183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTerm->leftCursor != pSrc->iCursor ) continue;
100207 101184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( (pTerm->eOperator&(pTerm->eOperator-1))==0 );
100208 101185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( pTerm->eOperator==WO_IN );
100209 101186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( pTerm->eOperator==WO_ISNULL );
100210 101187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTerm->eOperator & (WO_IN|WO_ISNULL) ) continue;
101188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pTerm->wtFlags & TERM_VNULL ) continue;
100211 101189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nTerm++;
100212 101190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100213 101191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100214 101192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If the ORDER BY clause contains only columns in the current
100215 101193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** virtual table then allocate space for the aOrderBy part of
@@ -100256,10 +101234,11 @@
100256 101234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTerm->leftCursor != pSrc->iCursor ) continue;
100257 101235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( (pTerm->eOperator&(pTerm->eOperator-1))==0 );
100258 101236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( pTerm->eOperator==WO_IN );
100259 101237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( pTerm->eOperator==WO_ISNULL );
100260 101238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTerm->eOperator & (WO_IN|WO_ISNULL) ) continue;
101239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pTerm->wtFlags & TERM_VNULL ) continue;
100261 101240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdxCons[j].iColumn = pTerm->u.leftColumn;
100262 101241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdxCons[j].iTermOffset = i;
100263 101242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIdxCons[j].op = (u8)pTerm->eOperator;
100264 101243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The direct assignment in the previous line is possible only because
100265 101244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the WO_ and SQLITE_INDEX_CONSTRAINT_ codes are identical. The
@@ -100482,71 +101461,89 @@
100482 101461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
100483 101462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bestOrClauseIndex(pParse, pWC, pSrc, notReady, notValid, pOrderBy, pCost);
100484 101463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100485 101464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_OMIT_VIRTUALTABLE */
100486 101465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
100487 101467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
100488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Argument pIdx is a pointer to an index structure that has an array of
100489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** SQLITE_INDEX_SAMPLES evenly spaced samples of the first indexed column
100490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** stored in Index.aSample. These samples divide the domain of values stored
100491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the index into (SQLITE_INDEX_SAMPLES+1) regions.
100492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Region 0 contains all values less than the first sample value. Region
100493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** 1 contains values between the first and second samples. Region 2 contains
100494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** values between samples 2 and 3. And so on. Region SQLITE_INDEX_SAMPLES
100495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** contains values larger than the last sample.
100496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
100497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If the index contains many duplicates of a single value, then it is
100498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** possible that two or more adjacent samples can hold the same value.
100499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** When that is the case, the smallest possible region code is returned
100500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** when roundUp is false and the largest possible region code is returned
100501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** when roundUp is true.
100502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
100503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If successful, this function determines which of the regions value
100504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** pVal lies in, sets *piRegion to the region index (a value between 0
100505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** and SQLITE_INDEX_SAMPLES+1, inclusive) and returns SQLITE_OK.
100506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Or, if an OOM occurs while converting text values between encodings,
100507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** SQLITE_NOMEM is returned and *piRegion is undefined.
100508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
100509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
100510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int whereRangeRegion(
101468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Estimate the location of a particular key among all keys in an
101469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** index. Store the results in aStat as follows:
101470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
101471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** aStat[0] Est. number of rows less than pVal
101472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** aStat[1] Est. number of rows equal to pVal
101473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
101474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Return SQLITE_OK on success.
101475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
101476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int whereKeyStats(
100511 101477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Parse *pParse, /* Database connection */
100512 101478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Index *pIdx, /* Index to consider domain of */
100513 101479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_value *pVal, /* Value to consider */
100514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int roundUp, /* Return largest valid region if true */
100515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *piRegion /* OUT: Region of domain in which value lies */
101480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int roundUp, /* Round up if true. Round down if false */
101481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt *aStat /* OUT: stats written here */
100516 101482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
101483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt n;
101484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ IndexSample *aSample;
101485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i, eType;
101486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isEq = 0;
101487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i64 v;
101488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double r, rS;
101489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100517 101490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( roundUp==0 || roundUp==1 );
100518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ALWAYS(pVal) ){
100519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- IndexSample *aSample = pIdx->aSample;
100520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i = 0;
100521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int eType = sqlite3_value_type(pVal);
100522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
100523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( eType==SQLITE_INTEGER || eType==SQLITE_FLOAT ){
100524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- double r = sqlite3_value_double(pVal);
100525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<SQLITE_INDEX_SAMPLES; i++){
100526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aSample[i].eType==SQLITE_NULL ) continue;
100527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aSample[i].eType>=SQLITE_TEXT ) break;
100528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( roundUp ){
100529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aSample[i].u.r>r ) break;
100530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
100531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aSample[i].u.r>=r ) break;
100532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
100533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
100534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( eType==SQLITE_NULL ){
100535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- i = 0;
100536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( roundUp ){
100537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( i<SQLITE_INDEX_SAMPLES && aSample[i].eType==SQLITE_NULL ) i++;
100538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
100539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
101491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pVal==0 ) return SQLITE_ERROR;
101492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ n = pIdx->aiRowEst[0];
101493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aSample = pIdx->aSample;
101494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = 0;
101495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ eType = sqlite3_value_type(pVal);
101496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
101497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eType==SQLITE_INTEGER ){
101498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ v = sqlite3_value_int64(pVal);
101499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r = (i64)v;
101500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<pIdx->nSample; i++){
101501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aSample[i].eType==SQLITE_NULL ) continue;
101502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aSample[i].eType>=SQLITE_TEXT ) break;
101503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aSample[i].eType==SQLITE_INTEGER ){
101504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aSample[i].u.i>=v ){
101505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isEq = aSample[i].u.i==v;
101506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
101507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
101509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( aSample[i].eType==SQLITE_FLOAT );
101510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aSample[i].u.r>=r ){
101511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isEq = aSample[i].u.r==r;
101512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
101513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( eType==SQLITE_FLOAT ){
101517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ r = sqlite3_value_double(pVal);
101518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<pIdx->nSample; i++){
101519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aSample[i].eType==SQLITE_NULL ) continue;
101520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aSample[i].eType>=SQLITE_TEXT ) break;
101521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aSample[i].eType==SQLITE_FLOAT ){
101522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rS = aSample[i].u.r;
101523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
101524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rS = aSample[i].u.i;
101525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rS>=r ){
101527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ isEq = rS==r;
101528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
101529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( eType==SQLITE_NULL ){
101532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ i = 0;
101533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pIdx->nSample>=1 && aSample[0].eType==SQLITE_NULL ) isEq = 1;
101534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
101535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB );
101536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<pIdx->nSample; i++){
101537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aSample[i].eType==SQLITE_TEXT || aSample[i].eType==SQLITE_BLOB ){
101538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
101539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i<pIdx->nSample ){
100540 101542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3 *db = pParse->db;
100541 101543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
CollSeq *pColl;
100542 101544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const u8 *z;
100543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n;
100544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
100545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* pVal comes from sqlite3ValueFromExpr() so the type cannot be NULL */
100546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( eType==SQLITE_TEXT || eType==SQLITE_BLOB );
100547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
100548 101545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( eType==SQLITE_BLOB ){
100549 101546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
z = (const u8 *)sqlite3_value_blob(pVal);
100550 101547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pColl = db->pDfltColl;
100551 101548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pColl->enc==SQLITE_UTF8 );
100552 101549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
@@ -100561,16 +101558,16 @@
100561 101558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_NOMEM;
100562 101559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100563 101560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( z && pColl && pColl->xCmp );
100564 101561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100565 101562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
n = sqlite3ValueBytes(pVal, pColl->enc);
100566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
100567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<SQLITE_INDEX_SAMPLES; i++){
101563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
101564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(; i<pIdx->nSample; i++){
100568 101565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int c;
100569 101566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int eSampletype = aSample[i].eType;
100570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( eSampletype==SQLITE_NULL || eSampletype<eType ) continue;
100571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (eSampletype!=eType) ) break;
101567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eSampletype<eType ) continue;
101568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( eSampletype!=eType ) break;
100572 101569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_UTF16
100573 101570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pColl->enc!=SQLITE_UTF8 ){
100574 101571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nSample;
100575 101572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zSample = sqlite3Utf8to16(
100576 101573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
db, pColl->enc, aSample[i].u.z, aSample[i].nByte, &nSample
@@ -100584,20 +101581,52 @@
100584 101581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
100585 101582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
100586 101583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{
100587 101584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
c = pColl->xCmp(pColl->pUser, aSample[i].nByte, aSample[i].u.z, n, z);
100588 101585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( c-roundUp>=0 ) break;
101586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( c>=0 ){
101587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( c==0 ) isEq = 1;
101588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
101589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100590 101590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100591 101591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
101592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100592 101593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( i>=0 && i<=SQLITE_INDEX_SAMPLES );
100594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *piRegion = i;
101594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* At this point, aSample[i] is the first sample that is greater than
101595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or equal to pVal. Or if i==pIdx->nSample, then all samples are less
101596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** than pVal. If aSample[i]==pVal, then isEq==1.
101597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
101598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isEq ){
101599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( i<pIdx->nSample );
101600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aStat[0] = aSample[i].nLt;
101601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aStat[1] = aSample[i].nEq;
101602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
101603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt iLower, iUpper, iGap;
101604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( i==0 ){
101605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iLower = 0;
101606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iUpper = aSample[0].nLt;
101607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
101608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iUpper = i>=pIdx->nSample ? n : aSample[i].nLt;
101609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iLower = aSample[i-1].nEq + aSample[i-1].nLt;
101610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aStat[1] = pIdx->avgEq;
101612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iLower>=iUpper ){
101613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iGap = 0;
101614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
101615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iGap = iUpper - iLower;
101616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iGap>=aStat[1]/2 ) iGap -= aStat[1]/2;
101617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( roundUp ){
101619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iGap = (iGap*2)/3;
101620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
101621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iGap = iGap/3;
101622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aStat[0] = iLower + iGap;
100595 101624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100596 101625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
100597 101626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* #ifdef SQLITE_ENABLE_STAT2 */
101627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_ENABLE_STAT3 */
100599 101628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100600 101629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
100601 101630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If expression pExpr represents a literal value, set *pp to point to
100602 101631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** an sqlite3_value structure containing the same value, with affinity
100603 101632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** aff applied to it, before returning. It is the responsibility of the
@@ -100611,11 +101640,11 @@
100611 101640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
100612 101641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If neither of the above apply, set *pp to NULL.
100613 101642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
100614 101643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If an error occurs, return an error code. Otherwise, SQLITE_OK.
100615 101644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
100616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
101645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
100617 101646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int valueFromExpr(
100618 101647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Parse *pParse,
100619 101648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pExpr,
100620 101649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 aff,
100621 101650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_value **pp
@@ -100659,106 +101688,92 @@
100659 101688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
100660 101689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** ... FROM t1 WHERE a > ? AND a < ? ...
100661 101690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
100662 101691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** then nEq should be passed 0.
100663 101692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
100664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The returned value is an integer between 1 and 100, inclusive. A return
100665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** value of 1 indicates that the proposed range scan is expected to visit
100666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** approximately 1/100th (1%) of the rows selected by the nEq equality
100667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** constraints (if any). A return value of 100 indicates that it is expected
100668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** that the range scan will visit every row (100%) selected by the equality
100669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** constraints.
101693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The returned value is an integer divisor to reduce the estimated
101694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** search space. A return value of 1 means that range constraints are
101695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** no help at all. A return value of 2 means range constraints are
101696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expected to reduce the search space by half. And so forth...
100670 101697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
100671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** In the absence of sqlite_stat2 ANALYZE data, each range inequality
100672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** reduces the search space by 3/4ths. Hence a single constraint (x>?)
100673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** results in a return of 25 and a range constraint (x>? AND x<?) results
100674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** in a return of 6.
101698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** In the absence of sqlite_stat3 ANALYZE data, each range inequality
101699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** reduces the search space by a factor of 4. Hence a single constraint (x>?)
101700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** results in a return of 4 and a range constraint (x>? AND x<?) results
101701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in a return of 16.
100675 101702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
100676 101703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int whereRangeScanEst(
100677 101704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Parse *pParse, /* Parsing & code generating context */
100678 101705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Index *p, /* The index containing the range-compared column; "x" */
100679 101706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nEq, /* index into p->aCol[] of the range-compared column */
100680 101707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereTerm *pLower, /* Lower bound on the range. ex: "x>123" Might be NULL */
100681 101708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereTerm *pUpper, /* Upper bound on the range. ex: "x<455" Might be NULL */
100682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *piEst /* OUT: Return value */
101709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double *pRangeDiv /* OUT: Reduce search space by this divisor */
100683 101710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
100684 101711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
100685 101712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
100687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
100688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nEq==0 && p->aSample ){
100689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_value *pLowerVal = 0;
100690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_value *pUpperVal = 0;
100691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iEst;
100692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iLower = 0;
100693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iUpper = SQLITE_INDEX_SAMPLES;
100694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int roundUpUpper = 0;
100695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int roundUpLower = 0;
101713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
101714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
101715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nEq==0 && p->nSample ){
101716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_value *pRangeVal;
101717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt iLower = 0;
101718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt iUpper = p->aiRowEst[0];
101719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt a[2];
100696 101720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 aff = p->pTable->aCol[p->aiColumn[0]].affinity;
100697 101721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100698 101722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pLower ){
100699 101723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pExpr = pLower->pExpr->pRight;
100700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = valueFromExpr(pParse, pExpr, aff, &pLowerVal);
101724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = valueFromExpr(pParse, pExpr, aff, &pRangeVal);
100701 101725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pLower->eOperator==WO_GT || pLower->eOperator==WO_GE );
100702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- roundUpLower = (pLower->eOperator==WO_GT) ?1:0;
101726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK
101727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && whereKeyStats(pParse, p, pRangeVal, 0, a)==SQLITE_OK
101728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
101729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iLower = a[0];
101730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pLower->eOperator==WO_GT ) iLower += a[1];
101731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ValueFree(pRangeVal);
100703 101733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100704 101734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK && pUpper ){
100705 101735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pExpr = pUpper->pExpr->pRight;
100706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = valueFromExpr(pParse, pExpr, aff, &pUpperVal);
101736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = valueFromExpr(pParse, pExpr, aff, &pRangeVal);
100707 101737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pUpper->eOperator==WO_LT || pUpper->eOperator==WO_LE );
100708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- roundUpUpper = (pUpper->eOperator==WO_LE) ?1:0;
100709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
100710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
100711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK || (pLowerVal==0 && pUpperVal==0) ){
100712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3ValueFree(pLowerVal);
100713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3ValueFree(pUpperVal);
100714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto range_est_fallback;
100715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( pLowerVal==0 ){
100716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = whereRangeRegion(pParse, p, pUpperVal, roundUpUpper, &iUpper);
100717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pLower ) iLower = iUpper/2;
100718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( pUpperVal==0 ){
100719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = whereRangeRegion(pParse, p, pLowerVal, roundUpLower, &iLower);
100720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pUpper ) iUpper = (iLower + SQLITE_INDEX_SAMPLES + 1)/2;
100721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
100722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = whereRangeRegion(pParse, p, pUpperVal, roundUpUpper, &iUpper);
100723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
100724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = whereRangeRegion(pParse, p, pLowerVal, roundUpLower, &iLower);
100725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
100726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
100727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- WHERETRACE(("range scan regions: %d..%d\n", iLower, iUpper));
100728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
100729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iEst = iUpper - iLower;
100730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- testcase( iEst==SQLITE_INDEX_SAMPLES );
100731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( iEst<=SQLITE_INDEX_SAMPLES );
100732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iEst<1 ){
100733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *piEst = 50/SQLITE_INDEX_SAMPLES;
100734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
100735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *piEst = (iEst*100)/SQLITE_INDEX_SAMPLES;
100736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
100737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3ValueFree(pLowerVal);
100738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3ValueFree(pUpperVal);
100739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
100740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
100741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- range_est_fallback:
101738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK
101739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && whereKeyStats(pParse, p, pRangeVal, 1, a)==SQLITE_OK
101740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
101741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iUpper = a[0];
101742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pUpper->eOperator==WO_LE ) iUpper += a[1];
101743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3ValueFree(pRangeVal);
101745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
101747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iUpper<=iLower ){
101748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRangeDiv = (double)p->aiRowEst[0];
101749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
101750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRangeDiv = (double)p->aiRowEst[0]/(double)(iUpper - iLower);
101751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERETRACE(("range scan regions: %u..%u div=%g\n",
101753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (u32)iLower, (u32)iUpper, *pRangeDiv));
101754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
101755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100742 101757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#else
100743 101758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(pParse);
100744 101759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(p);
100745 101760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(nEq);
100746 101761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
100747 101762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pLower || pUpper );
100748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *piEst = 100;
100749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pLower && (pLower->wtFlags & TERM_VNULL)==0 ) *piEst /= 4;
100750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pUpper ) *piEst /= 4;
101763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRangeDiv = (double)1;
101764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pLower && (pLower->wtFlags & TERM_VNULL)==0 ) *pRangeDiv *= (double)4;
101765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pUpper ) *pRangeDiv *= (double)4;
100751 101766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
100752 101767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100753 101768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
101769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
100755 101770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
100756 101771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Estimate the number of rows that will be returned based on
100757 101772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** an equality constraint x=VALUE and where that VALUE occurs in
100758 101773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the histogram data. This only works when x is the left-most
100759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** column of an index and sqlite_stat2 histogram data is available
101774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** column of an index and sqlite_stat3 histogram data is available
100760 101775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** for that index. When pExpr==NULL that means the constraint is
100761 101776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** "x IS NULL" instead of "x=VALUE".
100762 101777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
100763 101778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Write the estimated row count into *pnRow and return SQLITE_OK.
100764 101779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If unable to make an estimate, leave *pnRow unchanged and return
@@ -100774,14 +101789,13 @@
100774 101789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Index *p, /* The index whose left-most column is pTerm */
100775 101790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pExpr, /* Expression for VALUE in the x=VALUE constraint */
100776 101791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
double *pnRow /* Write the revised row estimate here */
100777 101792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
100778 101793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_value *pRhs = 0; /* VALUE on right-hand side of pTerm */
100779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iLower, iUpper; /* Range of histogram regions containing pRhs */
100780 101794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 aff; /* Column affinity */
100781 101795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc; /* Subfunction return code */
100782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- double nRowEst; /* New estimate of the number of rows */
101796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt a[2]; /* Statistics */
100783 101797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100784 101798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->aSample!=0 );
100785 101799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aff = p->pTable->aCol[p->aiColumn[0]].affinity;
100786 101800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pExpr ){
100787 101801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = valueFromExpr(pParse, pExpr, aff, &pRhs);
@@ -100788,30 +101802,22 @@
100788 101802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc ) goto whereEqualScanEst_cancel;
100789 101803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
100790 101804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pRhs = sqlite3ValueNew(pParse->db);
100791 101805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100792 101806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pRhs==0 ) return SQLITE_NOTFOUND;
100793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = whereRangeRegion(pParse, p, pRhs, 0, &iLower);
100794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc ) goto whereEqualScanEst_cancel;
100795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = whereRangeRegion(pParse, p, pRhs, 1, &iUpper);
100796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc ) goto whereEqualScanEst_cancel;
100797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- WHERETRACE(("equality scan regions: %d..%d\n", iLower, iUpper));
100798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iLower>=iUpper ){
100799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nRowEst = p->aiRowEst[0]/(SQLITE_INDEX_SAMPLES*2);
100800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nRowEst<*pnRow ) *pnRow = nRowEst;
100801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
100802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nRowEst = (iUpper-iLower)*p->aiRowEst[0]/SQLITE_INDEX_SAMPLES;
100803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnRow = nRowEst;
100804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
100805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
101807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = whereKeyStats(pParse, p, pRhs, 0, a);
101808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
101809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERETRACE(("equality scan regions: %d\n", (int)a[1]));
101810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnRow = a[1];
101811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
100806 101812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
whereEqualScanEst_cancel:
100807 101813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ValueFree(pRhs);
100808 101814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
100809 101815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* defined(SQLITE_ENABLE_STAT2) */
101816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* defined(SQLITE_ENABLE_STAT3) */
100811 101817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
101818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
100813 101819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
100814 101820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Estimate the number of rows that will be returned based on
100815 101821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** an IN constraint where the right-hand side of the IN operator
100816 101822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** is a list of values. Example:
100817 101823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -100830,64 +101836,29 @@
100830 101836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Parse *pParse, /* Parsing & code generating context */
100831 101837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Index *p, /* The index whose left-most column is pTerm */
100832 101838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ExprList *pList, /* The value list on the RHS of "x IN (v1,v2,v3,...)" */
100833 101839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
double *pnRow /* Write the revised row estimate here */
100834 101840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
100835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_value *pVal = 0; /* One value from list */
100836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iLower, iUpper; /* Range of histogram regions containing pRhs */
100837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u8 aff; /* Column affinity */
100838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = SQLITE_OK; /* Subfunction return code */
100839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- double nRowEst; /* New estimate of the number of rows */
100840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nSpan = 0; /* Number of histogram regions spanned */
100841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nSingle = 0; /* Histogram regions hit by a single value */
100842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nNotFound = 0; /* Count of values that are not constants */
100843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i; /* Loop counter */
100844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u8 aSpan[SQLITE_INDEX_SAMPLES+1]; /* Histogram regions that are spanned */
100845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u8 aSingle[SQLITE_INDEX_SAMPLES+1]; /* Histogram regions hit once */
101841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Subfunction return code */
101842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double nEst; /* Number of rows for a single term */
101843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double nRowEst = (double)0; /* New estimate of the number of rows */
101844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Loop counter */
100846 101845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100847 101846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->aSample!=0 );
100848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aff = p->pTable->aCol[p->aiColumn[0]].affinity;
100849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(aSpan, 0, sizeof(aSpan));
100850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(aSingle, 0, sizeof(aSingle));
100851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<pList->nExpr; i++){
100852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3ValueFree(pVal);
100853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = valueFromExpr(pParse, pList->a[i].pExpr, aff, &pVal);
100854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc ) break;
100855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pVal==0 || sqlite3_value_type(pVal)==SQLITE_NULL ){
100856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nNotFound++;
100857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- continue;
100858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
100859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = whereRangeRegion(pParse, p, pVal, 0, &iLower);
100860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc ) break;
100861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = whereRangeRegion(pParse, p, pVal, 1, &iUpper);
100862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc ) break;
100863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iLower>=iUpper ){
100864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aSingle[iLower] = 1;
100865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
100866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( iLower>=0 && iUpper<=SQLITE_INDEX_SAMPLES );
100867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( iLower<iUpper ) aSpan[iLower++] = 1;
100868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
101847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; rc==SQLITE_OK && i<pList->nExpr; i++){
101848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nEst = p->aiRowEst[0];
101849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = whereEqualScanEst(pParse, p, pList->a[i].pExpr, &nEst);
101850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nRowEst += nEst;
100869 101851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100870 101852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
100871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=nSpan=0; i<=SQLITE_INDEX_SAMPLES; i++){
100872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aSpan[i] ){
100873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nSpan++;
100874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( aSingle[i] ){
100875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nSingle++;
100876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
100877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
100878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nRowEst = (nSpan*2+nSingle)*p->aiRowEst[0]/(2*SQLITE_INDEX_SAMPLES)
100879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- + nNotFound*p->aiRowEst[1];
100880 101853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nRowEst > p->aiRowEst[0] ) nRowEst = p->aiRowEst[0];
100881 101854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pnRow = nRowEst;
100882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- WHERETRACE(("IN row estimate: nSpan=%d, nSingle=%d, nNotFound=%d, est=%g\n",
100883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nSpan, nSingle, nNotFound, nRowEst));
101855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ WHERETRACE(("IN row estimate: est=%g\n", nRowEst));
100884 101856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3ValueFree(pVal);
100886 101857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
100887 101858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* defined(SQLITE_ENABLE_STAT2) */
101859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* defined(SQLITE_ENABLE_STAT3) */
100889 101860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100890 101861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100891 101862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
100892 101863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Find the best query plan for accessing a particular table. Write the
100893 101864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** best query plan and its cost into the WhereCost object supplied as the
@@ -100921,19 +101892,20 @@
100921 101892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereClause *pWC, /* The WHERE clause */
100922 101893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct SrcList_item *pSrc, /* The FROM clause term to search */
100923 101894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Bitmask notReady, /* Mask of cursors not available for indexing */
100924 101895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Bitmask notValid, /* Cursors not available for any purpose */
100925 101896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ExprList *pOrderBy, /* The ORDER BY clause */
101897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ExprList *pDistinct, /* The select-list if query is DISTINCT */
100926 101898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereCost *pCost /* Lowest cost query plan */
100927 101899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
100928 101900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iCur = pSrc->iCursor; /* The cursor of the table to be accessed */
100929 101901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Index *pProbe; /* An index we are evaluating */
100930 101902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Index *pIdx; /* Copy of pProbe, or zero for IPK index */
100931 101903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int eqTermMask; /* Current mask of valid equality operators */
100932 101904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int idxEqTermMask; /* Index mask of valid equality operators */
100933 101905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Index sPk; /* A fake index object for the primary key */
100934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- unsigned int aiRowEstPk[2]; /* The aiRowEst[] value for the sPk index */
101906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ tRowcnt aiRowEstPk[2]; /* The aiRowEst[] value for the sPk index */
100935 101907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int aiColumnPk = -1; /* The aColumn[] value for the sPk index */
100936 101908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int wsFlagMask; /* Allowed flags in pCost->plan.wsFlag */
100937 101909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100938 101910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Initialize the cost to a worst-case value */
100939 101911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(pCost, 0, sizeof(*pCost));
@@ -100984,11 +101956,11 @@
100984 101956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
100985 101957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
100986 101958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Loop over all indices looking for the best one to use
100987 101959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
100988 101960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(; pProbe; pIdx=pProbe=pProbe->pNext){
100989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const unsigned int * const aiRowEst = pProbe->aiRowEst;
101961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const tRowcnt * const aiRowEst = pProbe->aiRowEst;
100990 101962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
double cost; /* Cost of using pProbe */
100991 101963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
double nRow; /* Estimated number of rows in result set */
100992 101964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
double log10N; /* base-10 logarithm of nRow (inexact) */
100993 101965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rev; /* True to scan in reverse order */
100994 101966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int wsFlags = 0;
@@ -101027,18 +101999,16 @@
101027 101999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Set to true if there was at least one "x IN (SELECT ...)" term used
101028 102000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** in determining the value of nInMul. Note that the RHS of the
101029 102001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** IN operator must be a SELECT, not a value list, for this variable
101030 102002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to be true.
101031 102003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
101032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** estBound:
101033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** An estimate on the amount of the table that must be searched. A
101034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** value of 100 means the entire table is searched. Range constraints
101035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** might reduce this to a value less than 100 to indicate that only
101036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** a fraction of the table needs searching. In the absence of
101037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** sqlite_stat2 ANALYZE data, a single inequality reduces the search
101038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** space to 1/4rd its original size. So an x>? constraint reduces
101039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** estBound to 25. Two constraints (x>? AND x<?) reduce estBound to 6.
102004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** rangeDiv:
102005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** An estimate of a divisor by which to reduce the search space due
102006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to inequality constraints. In the absence of sqlite_stat3 ANALYZE
102007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** data, a single inequality reduces the search space to 1/4rd its
102008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** original size (rangeDiv==4). Two inequalities reduce the search
102009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** space to 1/16th of its original size (rangeDiv==16).
101040 102010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
101041 102011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** bSort:
101042 102012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Boolean. True if there is an ORDER BY clause that will require an
101043 102013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** external sort (i.e. scanning the index being evaluated will not
101044 102014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** correctly order records).
@@ -101059,16 +102029,17 @@
101059 102029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SELECT a, b, c FROM tbl WHERE a = 1;
101060 102030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
101061 102031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nEq; /* Number of == or IN terms matching index */
101062 102032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int bInEst = 0; /* True if "x IN (SELECT...)" seen */
101063 102033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nInMul = 1; /* Number of distinct equalities to lookup */
101064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int estBound = 100; /* Estimated reduction in search space */
102034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double rangeDiv = (double)1; /* Estimated reduction in search space */
101065 102035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nBound = 0; /* Number of range constraints seen */
101066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int bSort = 0; /* True if external sort required */
102036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bSort = !!pOrderBy; /* True if external sort required */
102037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bDist = !!pDistinct; /* True if index cannot help with DISTINCT */
101067 102038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int bLookup = 0; /* True if not a covering index */
101068 102039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereTerm *pTerm; /* A single term of the WHERE clause */
101069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
102040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
101070 102041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereTerm *pFirstTerm = 0; /* First term matching the index */
101071 102042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
101072 102043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101073 102044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Determine the values of nEq and nInMul */
101074 102045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(nEq=0; nEq<pProbe->nColumn; nEq++){
@@ -101088,23 +102059,23 @@
101088 102059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nInMul *= pExpr->x.pList->nExpr;
101089 102060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
101090 102061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( pTerm->eOperator & WO_ISNULL ){
101091 102062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
wsFlags |= WHERE_COLUMN_NULL;
101092 102063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
101093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
102064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
101094 102065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nEq==0 && pProbe->aSample ) pFirstTerm = pTerm;
101095 102066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
101096 102067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
used |= pTerm->prereqRight;
101097 102068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
101098 102069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Determine the value of estBound. */
102070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Determine the value of rangeDiv */
101100 102071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nEq<pProbe->nColumn && pProbe->bUnordered==0 ){
101101 102072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int j = pProbe->aiColumn[nEq];
101102 102073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( findTerm(pWC, iCur, j, notReady, WO_LT|WO_LE|WO_GT|WO_GE, pIdx) ){
101103 102074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereTerm *pTop = findTerm(pWC, iCur, j, notReady, WO_LT|WO_LE, pIdx);
101104 102075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereTerm *pBtm = findTerm(pWC, iCur, j, notReady, WO_GT|WO_GE, pIdx);
101105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- whereRangeScanEst(pParse, pProbe, nEq, pBtm, pTop, &estBound);
102076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ whereRangeScanEst(pParse, pProbe, nEq, pBtm, pTop, &rangeDiv);
101106 102077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTop ){
101107 102078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nBound = 1;
101108 102079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
wsFlags |= WHERE_TOP_LIMIT;
101109 102080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
used |= pTop->prereqRight;
101110 102081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -101125,21 +102096,24 @@
101125 102096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101126 102097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there is an ORDER BY clause and the index being considered will
101127 102098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** naturally scan rows in the required order, set the appropriate flags
101128 102099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** in wsFlags. Otherwise, if there is an ORDER BY clause but the index
101129 102100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** will scan rows in a different order, set the bSort variable. */
101130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pOrderBy ){
101131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (wsFlags & WHERE_COLUMN_IN)==0
101132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && pProbe->bUnordered==0
101133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && isSortingIndex(pParse, pWC->pMaskSet, pProbe, iCur, pOrderBy,
101134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nEq, wsFlags, &rev)
101135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
101136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- wsFlags |= WHERE_ROWID_RANGE|WHERE_COLUMN_RANGE|WHERE_ORDERBY;
101137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- wsFlags |= (rev ? WHERE_REVERSE : 0);
101138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
101139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- bSort = 1;
101140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
102101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isSortingIndex(
102102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pParse, pWC->pMaskSet, pProbe, iCur, pOrderBy, nEq, wsFlags, &rev)
102103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
102104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bSort = 0;
102105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wsFlags |= WHERE_ROWID_RANGE|WHERE_COLUMN_RANGE|WHERE_ORDERBY;
102106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wsFlags |= (rev ? WHERE_REVERSE : 0);
102107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
102108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
102109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If there is a DISTINCT qualifier and this index will scan rows in
102110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** order of the DISTINCT expressions, clear bDist and set the appropriate
102111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** flags in wsFlags. */
102112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isDistinctIndex(pParse, pWC, pProbe, iCur, pDistinct, nEq) ){
102113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bDist = 0;
102114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ wsFlags |= WHERE_ROWID_RANGE|WHERE_COLUMN_RANGE|WHERE_DISTINCT;
101141 102115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
101142 102116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101143 102117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If currently calculating the cost of using an index (not the IPK
101144 102118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** index), determine if all required column data may be obtained without
101145 102119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** using the main table (i.e. if the index is a covering
@@ -101169,31 +102143,32 @@
101169 102143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( bInEst && nRow*2>aiRowEst[0] ){
101170 102144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nRow = aiRowEst[0]/2;
101171 102145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nInMul = (int)(nRow / aiRowEst[nEq]);
101172 102146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
101173 102147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifdef SQLITE_ENABLE_STAT2
101175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If the constraint is of the form x=VALUE and histogram
102148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_ENABLE_STAT3
102149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the constraint is of the form x=VALUE or x IN (E1,E2,...)
102150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and we do not think that values of x are unique and if histogram
101176 102151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** data is available for column x, then it might be possible
101177 102152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to get a better estimate on the number of rows based on
101178 102153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** VALUE and how common that value is according to the histogram.
101179 102154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
101180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nRow>(double)1 && nEq==1 && pFirstTerm!=0 ){
102155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nRow>(double)1 && nEq==1 && pFirstTerm!=0 && aiRowEst[1]>1 ){
101181 102156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pFirstTerm->eOperator & (WO_EQ|WO_ISNULL) ){
101182 102157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( pFirstTerm->eOperator==WO_EQ );
101183 102158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( pFirstTerm->eOperator==WO_ISNULL );
101184 102159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
whereEqualScanEst(pParse, pProbe, pFirstTerm->pExpr->pRight, &nRow);
101185 102160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( pFirstTerm->eOperator==WO_IN && bInEst==0 ){
101186 102161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
whereInScanEst(pParse, pProbe, pFirstTerm->pExpr->x.pList, &nRow);
101187 102162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
101188 102163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
101189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif /* SQLITE_ENABLE_STAT2 */
102164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* SQLITE_ENABLE_STAT3 */
101190 102165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101191 102166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Adjust the number of output rows and downward to reflect rows
101192 102167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** that are excluded by range constraints.
101193 102168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
101194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nRow = (nRow * (double)estBound) / (double)100;
102169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nRow = nRow/rangeDiv;
101195 102170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nRow<1 ) nRow = 1;
101196 102171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101197 102172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Experiments run on real SQLite databases show that the time needed
101198 102173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** to do a binary search to locate a row in a table or index is roughly
101199 102174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** log10(N) times the time to move from one row to the next row within
@@ -101252,10 +102227,13 @@
101252 102227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** difference and select C of 3.0.
101253 102228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
101254 102229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( bSort ){
101255 102230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cost += nRow*estLog(nRow)*3;
101256 102231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
102232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bDist ){
102233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ cost += nRow*estLog(nRow)*3;
102234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
101257 102235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101258 102236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/**** Cost of using this index has now been computed ****/
101259 102237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101260 102238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If there are additional constraints on this table that cannot
101261 102239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** be used with the current index, but which might lower the number
@@ -101315,14 +102293,14 @@
101315 102293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nRow<2 ) nRow = 2;
101316 102294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
101317 102295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101318 102296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101319 102297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WHERETRACE((
101320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "%s(%s): nEq=%d nInMul=%d estBound=%d bSort=%d bLookup=%d wsFlags=0x%x\n"
102298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "%s(%s): nEq=%d nInMul=%d rangeDiv=%d bSort=%d bLookup=%d wsFlags=0x%x\n"
101321 102299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" notReady=0x%llx log10N=%.1f nRow=%.1f cost=%.1f used=0x%llx\n",
101322 102300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pSrc->pTab->zName, (pIdx ? pIdx->zName : "ipk"),
101323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nEq, nInMul, estBound, bSort, bLookup, wsFlags,
102301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nEq, nInMul, (int)rangeDiv, bSort, bLookup, wsFlags,
101324 102302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
notReady, log10N, nRow, cost, used
101325 102303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
));
101326 102304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101327 102305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If this index is the best we have seen so far, then record this
101328 102306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** index and its cost in the pCost structure.
@@ -101397,11 +102375,11 @@
101397 102375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
101398 102376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3DbFree(pParse->db, p);
101399 102377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
101400 102378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
101401 102379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{
101402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- bestBtreeIndex(pParse, pWC, pSrc, notReady, notValid, pOrderBy, pCost);
102380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bestBtreeIndex(pParse, pWC, pSrc, notReady, notValid, pOrderBy, 0, pCost);
101403 102381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
101404 102382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
101405 102383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
101406 102384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
101407 102385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Disable a term in the WHERE clause. Except, do not disable the term
@@ -102359,11 +103337,11 @@
102359 103337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(ii=0; ii<pOrWc->nTerm; ii++){
102360 103338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereTerm *pOrTerm = &pOrWc->a[ii];
102361 103339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pOrTerm->leftCursor==iCur || pOrTerm->eOperator==WO_AND ){
102362 103340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereInfo *pSubWInfo; /* Info for single OR-term scan */
102363 103341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Loop through table entries that match term pOrTerm. */
102364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrTerm->pExpr, 0,
103342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSubWInfo = sqlite3WhereBegin(pParse, pOrTab, pOrTerm->pExpr, 0, 0,
102365 103343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WHERE_OMIT_OPEN | WHERE_OMIT_CLOSE |
102366 103344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WHERE_FORCE_TABLE | WHERE_ONETABLE_ONLY);
102367 103345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pSubWInfo ){
102368 103346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
explainOneScan(
102369 103347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pParse, pOrTab, &pSubWInfo->a[0], iLevel, pLevel->iFrom, 0
@@ -102600,10 +103578,11 @@
102600 103578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE WhereInfo *sqlite3WhereBegin(
102601 103579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Parse *pParse, /* The parser context */
102602 103580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SrcList *pTabList, /* A list of all tables to be scanned */
102603 103581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Expr *pWhere, /* The WHERE clause */
102604 103582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ExprList **ppOrderBy, /* An ORDER BY clause, or NULL */
103583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ExprList *pDistinct, /* The select-list for DISTINCT queries - or NULL */
102605 103584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u16 wctrlFlags /* One of the WHERE_* flags defined in sqliteInt.h */
102606 103585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
102607 103586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i; /* Loop counter */
102608 103587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nByteWInfo; /* Num. bytes allocated for WhereInfo struct */
102609 103588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nTabList; /* Number of elements in pTabList */
@@ -102659,10 +103638,14 @@
102659 103638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pWInfo->iBreak = sqlite3VdbeMakeLabel(v);
102660 103639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pWInfo->pWC = pWC = (WhereClause *)&((u8 *)pWInfo)[nByteWInfo];
102661 103640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pWInfo->wctrlFlags = wctrlFlags;
102662 103641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pWInfo->savedNQueryLoop = pParse->nQueryLoop;
102663 103642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pMaskSet = (WhereMaskSet*)&pWC[1];
103643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Disable the DISTINCT optimization if SQLITE_DistinctOpt is set via
103645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3_test_ctrl(SQLITE_TESTCTRL_OPTIMIZATIONS,...) */
103646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( db->flags & SQLITE_DistinctOpt ) pDistinct = 0;
102664 103647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
102665 103648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Split the WHERE clause into separate subexpressions where each
102666 103649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** subexpression is separated by an AND operator.
102667 103650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
102668 103651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
initMaskSet(pMaskSet);
@@ -102726,10 +103709,19 @@
102726 103709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
102727 103710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
exprAnalyzeAll(pTabList, pWC);
102728 103711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( db->mallocFailed ){
102729 103712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto whereBeginError;
102730 103713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
103714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
103715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Check if the DISTINCT qualifier, if there is one, is redundant.
103716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If it is, then set pDistinct to NULL and WhereInfo.eDistinct to
103717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** WHERE_DISTINCT_UNIQUE to tell the caller to ignore the DISTINCT.
103718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
103719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pDistinct && isDistinctRedundant(pParse, pTabList, pWC, pDistinct) ){
103720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDistinct = 0;
103721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWInfo->eDistinct = WHERE_DISTINCT_UNIQUE;
103722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
102731 103723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
102732 103724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Chose the best index to use for each table in the FROM clause.
102733 103725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
102734 103726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This loop fills in the following fields:
102735 103727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -102810,10 +103802,11 @@
102810 103802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Bitmask mask; /* Mask of tables not yet ready */
102811 103803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(j=iFrom, pTabItem=&pTabList->a[j]; j<nTabList; j++, pTabItem++){
102812 103804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int doNotReorder; /* True if this table should not be reordered */
102813 103805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WhereCost sCost; /* Cost information from best[Virtual]Index() */
102814 103806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
ExprList *pOrderBy; /* ORDER BY clause for index to optimize */
103807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ExprList *pDist; /* DISTINCT clause for index to optimize */
102815 103808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
102816 103809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
doNotReorder = (pTabItem->jointype & (JT_LEFT|JT_CROSS))!=0;
102817 103810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( j!=iFrom && doNotReorder ) break;
102818 103811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
m = getMask(pMaskSet, pTabItem->iCursor);
102819 103812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (m & notReady)==0 ){
@@ -102820,10 +103813,11 @@
102820 103813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( j==iFrom ) iFrom++;
102821 103814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
continue;
102822 103815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
102823 103816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
mask = (isOptimal ? m : notReady);
102824 103817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pOrderBy = ((i==0 && ppOrderBy )?*ppOrderBy:0);
103818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDist = (i==0 ? pDistinct : 0);
102825 103819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTabItem->pIndex==0 ) nUnconstrained++;
102826 103820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
102827 103821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WHERETRACE(("=== trying table %d with isOptimal=%d ===\n",
102828 103822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
j, isOptimal));
102829 103823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pTabItem->pTab );
@@ -102834,11 +103828,11 @@
102834 103828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&sCost, pp);
102835 103829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else
102836 103830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
102837 103831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
{
102838 103832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bestBtreeIndex(pParse, pWC, pTabItem, mask, notReady, pOrderBy,
102839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- &sCost);
103833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDist, &sCost);
102840 103834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
102841 103835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( isOptimal || (sCost.used¬Ready)==0 );
102842 103836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
102843 103837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If an INDEXED BY clause is present, then the plan must use that
102844 103838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** index if it uses any index at all */
@@ -102894,10 +103888,14 @@
102894 103888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
WHERETRACE(("*** Optimizer selects table %d for loop %d"
102895 103889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
" with cost=%g and nRow=%g\n",
102896 103890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bestJ, pLevel-pWInfo->a, bestPlan.rCost, bestPlan.plan.nRow));
102897 103891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (bestPlan.plan.wsFlags & WHERE_ORDERBY)!=0 ){
102898 103892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*ppOrderBy = 0;
103893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
103894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (bestPlan.plan.wsFlags & WHERE_DISTINCT)!=0 ){
103895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pWInfo->eDistinct==0 );
103896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pWInfo->eDistinct = WHERE_DISTINCT_ORDERED;
102899 103897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
102900 103898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
andFlags &= bestPlan.plan.wsFlags;
102901 103899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pLevel->plan = bestPlan.plan;
102902 103900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( bestPlan.plan.wsFlags & WHERE_INDEXED );
102903 103901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( bestPlan.plan.wsFlags & WHERE_TEMP_INDEX );
@@ -107274,17 +108272,16 @@
107274 108272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_OMIT_BLOB_LITERAL
107275 108273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case 'x': case 'X': {
107276 108274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
testcase( z[0]=='x' ); testcase( z[0]=='X' );
107277 108275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( z[1]=='\'' ){
107278 108276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*tokenType = TK_BLOB;
107279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=2; (c=z[i])!=0 && c!='\''; i++){
107280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !sqlite3Isxdigit(c) ){
107281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *tokenType = TK_ILLEGAL;
107282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
108277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=2; sqlite3Isxdigit(z[i]); i++){}
108278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( z[i]!='\'' || i%2 ){
108279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *tokenType = TK_ILLEGAL;
108280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( z[i] && z[i]!='\'' ){ i++; }
107283 108281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
107284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i%2 || !c ) *tokenType = TK_ILLEGAL;
107285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( c ) i++;
108282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( z[i] ) i++;
107286 108283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return i;
107287 108284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
107288 108285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Otherwise fall through to the next case */
107289 108286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
107290 108287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
@@ -110726,10 +111723,21 @@
110726 111723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sz ) *ppNew = sqlite3ScratchMalloc(sz);
110727 111724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3ScratchFree(pFree);
110728 111725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
110729 111726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
110730 111727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* sqlite3_test_control(SQLITE_TESTCTRL_LOCALTIME_FAULT, int onoff);
111729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
111730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If parameter onoff is non-zero, configure the wrappers so that all
111731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** subsequent calls to localtime() and variants fail. If onoff is zero,
111732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** undo this setting.
111733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
111734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case SQLITE_TESTCTRL_LOCALTIME_FAULT: {
111735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3GlobalConfig.bLocaltimeFault = va_arg(ap, int);
111736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
111737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
111738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
110731 111739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
110732 111740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
va_end(ap);
110733 111741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* SQLITE_OMIT_BUILTIN_TEST */
110734 111742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
110735 111743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -111383,16 +112391,10 @@
111383 112391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** TODO(shess) Provide a VACUUM type operation to clear out all
111384 112392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** deletions and duplications. This would basically be a forced merge
111385 112393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** into a single segment.
111386 112394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
111387 112395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
111389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
111390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #if defined(SQLITE_ENABLE_FTS3) && !defined(SQLITE_CORE)
111391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- # define SQLITE_CORE 1
111392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
111393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
111394 112396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** Include fts3Int.h in the middle of fts3.c ********************/
111395 112397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** Begin file fts3Int.h *****************************************/
111396 112398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
111397 112399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 2009 Nov 12
111398 112400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -111404,18 +112406,33 @@
111404 112406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** May you share freely, never taking more than you give.
111405 112407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
111406 112408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
******************************************************************************
111407 112409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
111408 112410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
111409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
111410 112411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef _FTSINT_H
111411 112412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define _FTSINT_H
111412 112413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111413 112414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if !defined(NDEBUG) && !defined(SQLITE_DEBUG)
111414 112415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# define NDEBUG 1
111415 112416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
111416 112417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
112419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** FTS4 is really an extension for FTS3. It is enabled using the
112420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_ENABLE_FTS3 macro. But to avoid confusion we also all
112421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the SQLITE_ENABLE_FTS4 macro to serve as an alisse for SQLITE_ENABLE_FTS3.
112422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
112423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(SQLITE_ENABLE_FTS4) && !defined(SQLITE_ENABLE_FTS3)
112424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define SQLITE_ENABLE_FTS3
112425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
112426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
112427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
112428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
112429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If not building as part of the core, include sqlite3ext.h. */
112430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef SQLITE_CORE
112431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_API extern const sqlite3_api_routines *sqlite3_api;
112432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
112433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
111417 112434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** Include fts3_tokenizer.h in the middle of fts3Int.h **********/
111418 112435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** Begin file fts3_tokenizer.h **********************************/
111419 112436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
111420 112437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 2006 July 10
111421 112438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -111710,16 +112727,39 @@
111710 112727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** similar macro called ArraySize(). Use a different name to avoid
111711 112728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a collision when building an amalgamation with built-in FTS3.
111712 112729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
111713 112730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SizeofArray(X) ((int)(sizeof(X)/sizeof(X[0])))
111714 112731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
112733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifndef MIN
112734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define MIN(x,y) ((x)<(y)?(x):(y))
112735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
112736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
111715 112737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
111716 112738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Maximum length of a varint encoded integer. The varint format is different
111717 112739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** from that used by SQLite, so the maximum length is 10, not 9.
111718 112740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
111719 112741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define FTS3_VARINT_MAX 10
111720 112742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
112744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** FTS4 virtual tables may maintain multiple indexes - one index of all terms
112745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in the document set and zero or more prefix indexes. All indexes are stored
112746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** as one or more b+-trees in the %_segments and %_segdir tables.
112747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
112748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** It is possible to determine which index a b+-tree belongs to based on the
112749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** value stored in the "%_segdir.level" column. Given this value L, the index
112750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that the b+-tree belongs to is (L<<10). In other words, all b+-trees with
112751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** level values between 0 and 1023 (inclusive) belong to index 0, all levels
112752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** between 1024 and 2047 to index 1, and so on.
112753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
112754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** It is considered impossible for an index to use more than 1024 levels. In
112755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** theory though this may happen, but only after at least
112756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (FTS3_MERGE_COUNT^1024) separate flushes of the pending-terms tables.
112757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
112758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define FTS3_SEGDIR_MAXLEVEL 1024
112759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define FTS3_SEGDIR_MAXLEVEL_STR "1024"
112760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
111721 112761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
111722 112762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The testcase() macro is only used by the amalgamation. If undefined,
111723 112763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** make it a no-op.
111724 112764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
111725 112765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef testcase
@@ -111787,14 +112827,15 @@
111787 112827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct Fts3Cursor Fts3Cursor;
111788 112828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct Fts3Expr Fts3Expr;
111789 112829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct Fts3Phrase Fts3Phrase;
111790 112830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct Fts3PhraseToken Fts3PhraseToken;
111791 112831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct Fts3Doclist Fts3Doclist;
111792 112833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct Fts3SegFilter Fts3SegFilter;
111793 112834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct Fts3DeferredToken Fts3DeferredToken;
111794 112835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct Fts3SegReader Fts3SegReader;
111795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- typedef struct Fts3SegReaderCursor Fts3SegReaderCursor;
112836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct Fts3MultiSegReader Fts3MultiSegReader;
111796 112837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111797 112838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
111798 112839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A connection to a fulltext index is an instance of the following
111799 112840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** structure. The xCreate and xConnect methods create an instance
111800 112841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of this structure and xDestroy and xDisconnect free that instance.
@@ -111811,33 +112852,45 @@
111811 112852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_tokenizer *pTokenizer; /* tokenizer for inserts and queries */
111812 112853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111813 112854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Precompiled statements used by the implementation. Each of these
111814 112855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** statements is run and reset within a single virtual table API call.
111815 112856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
111816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_stmt *aStmt[24];
112857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_stmt *aStmt[27];
111817 112858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111818 112859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zReadExprlist;
111819 112860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zWriteExprlist;
111820 112861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111821 112862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nNodeSize; /* Soft limit for node size */
111822 112863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 bHasStat; /* True if %_stat table exists */
111823 112864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u8 bHasDocsize; /* True if %_docsize table exists */
112865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 bDescIdx; /* True if doclists are in reverse order */
111824 112866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nPgsz; /* Page size for host database */
111825 112867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zSegmentsTbl; /* Name of %_segments table */
111826 112868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_blob *pSegments; /* Blob handle open on %_segments table */
111827 112869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* The following hash table is used to buffer pending index updates during
112870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* TODO: Fix the first paragraph of this comment.
112871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
112872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The following hash table is used to buffer pending index updates during
111829 112873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** transactions. Variable nPendingData estimates the memory size of the
111830 112874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** pending data, including hash table overhead, but not malloc overhead.
111831 112875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** When nPendingData exceeds nMaxPendingData, the buffer is flushed
111832 112876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** automatically. Variable iPrevDocid is the docid of the most recently
111833 112877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** inserted record.
112878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
112879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** A single FTS4 table may have multiple full-text indexes. For each index
112880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** there is an entry in the aIndex[] array. Index 0 is an index of all the
112881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** terms that appear in the document set. Each subsequent index in aIndex[]
112882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is an index of prefixes of a specific length.
111834 112883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
111835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nMaxPendingData;
111836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nPendingData;
111837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite_int64 iPrevDocid;
111838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Hash pendingTerms;
112884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nIndex; /* Size of aIndex[] */
112885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Fts3Index {
112886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nPrefix; /* Prefix length (0 for main terms index) */
112887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Hash hPending; /* Pending terms table for this index */
112888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } *aIndex;
112889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nMaxPendingData; /* Max pending data before flush to disk */
112890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nPendingData; /* Current bytes of pending data */
112891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite_int64 iPrevDocid; /* Docid of most recently inserted document */
111839 112892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111840 112893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if defined(SQLITE_DEBUG)
111841 112894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* State variables used for validating that the transaction control
111842 112895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** methods of the virtual table are called at appropriate times. These
111843 112896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** values do not contribution to the FTS computation; they are used for
@@ -111864,13 +112917,14 @@
111864 112917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3DeferredToken *pDeferred; /* Deferred search tokens, if any */
111865 112918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iPrevId; /* Previous id read from aDoclist */
111866 112919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *pNextId; /* Pointer into the body of aDoclist */
111867 112920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aDoclist; /* List of docids for full-text queries */
111868 112921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nDoclist; /* Size of buffer at aDoclist */
111869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int desc; /* True to sort in descending order */
112922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 bDesc; /* True to sort in descending order */
111870 112923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int eEvalmode; /* An FTS3_EVAL_XX constant */
111871 112924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nRowAvg; /* Average size of database rows, in pages */
112925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 nDoc; /* Documents in table */
111872 112926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111873 112927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isMatchinfoNeeded; /* True when aMatchinfo[] needs filling in */
111874 112928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u32 *aMatchinfo; /* Information about most recent match */
111875 112929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nMatchinfo; /* Number of elements in aMatchinfo[] */
111876 112930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zMatchinfo; /* Matchinfo specification */
@@ -111897,66 +112951,90 @@
111897 112951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
111898 112952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define FTS3_FULLSCAN_SEARCH 0 /* Linear scan of %_content table */
111899 112953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define FTS3_DOCID_SEARCH 1 /* Lookup by rowid on %_content table */
111900 112954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define FTS3_FULLTEXT_SEARCH 2 /* Full-text index search */
111901 112955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
112957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Fts3Doclist {
112958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aAll; /* Array containing doclist (or NULL) */
112959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nAll; /* Size of a[] in bytes */
112960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pNextDocid; /* Pointer to next docid */
112961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
112962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iDocid; /* Current docid (if pList!=0) */
112963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bFreeList; /* True if pList should be sqlite3_free()d */
112964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pList; /* Pointer to position list following iDocid */
112965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nList; /* Length of position list */
112966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
112967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
111902 112968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
111903 112969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A "phrase" is a sequence of one or more tokens that must match in
111904 112970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sequence. A single token is the base case and the most common case.
111905 112971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** For a sequence of tokens contained in double-quotes (i.e. "one two three")
111906 112972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** nToken will be the number of tokens in the string.
111907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
111908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The nDocMatch and nMatch variables contain data that may be used by the
111909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** matchinfo() function. They are populated when the full-text index is
111910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** queried for hits on the phrase. If one or more tokens in the phrase
111911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** are deferred, the nDocMatch and nMatch variables are populated based
111912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** on the assumption that the
111913 112973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
111914 112974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Fts3PhraseToken {
111915 112975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *z; /* Text of the token */
111916 112976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int n; /* Number of bytes in buffer z */
111917 112977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isPrefix; /* True if token ends with a "*" character */
111918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int bFulltext; /* True if full-text index was used */
111919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReaderCursor *pSegcsr; /* Segment-reader for this token */
112978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
112979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Variables above this point are populated when the expression is
112980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** parsed (by code in fts3_expr.c). Below this point the variables are
112981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** used when evaluating the expression. */
111920 112982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3DeferredToken *pDeferred; /* Deferred token object for this token */
112983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pSegcsr; /* Segment-reader for this token */
111921 112984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
111922 112985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111923 112986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Fts3Phrase {
111924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Variables populated by fts3_expr.c when parsing a MATCH expression */
112987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Cache of doclist for this phrase. */
112988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Doclist doclist;
112989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bIncr; /* True if doclist is loaded incrementally */
112990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iDoclistToken;
112991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
112992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Variables below this point are populated by fts3_expr.c when parsing
112993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a MATCH expression. Everything above is part of the evaluation phase.
112994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
111925 112995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nToken; /* Number of tokens in the phrase */
111926 112996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iColumn; /* Index of column this phrase must match */
111927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int isNot; /* Phrase prefixed by unary not (-) operator */
111928 112997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3PhraseToken aToken[1]; /* One entry for each token in the phrase */
111929 112998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
111930 112999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111931 113000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
111932 113001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** A tree of these objects forms the RHS of a MATCH operator.
111933 113002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
111934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If Fts3Expr.eType is either FTSQUERY_NEAR or FTSQUERY_PHRASE and isLoaded
111935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is true, then aDoclist points to a malloced buffer, size nDoclist bytes,
111936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** containing the results of the NEAR or phrase query in FTS3 doclist
111937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** format. As usual, the initial "Length" field found in doclists stored
111938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** on disk is omitted from this buffer.
113003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If Fts3Expr.eType is FTSQUERY_PHRASE and isLoaded is true, then aDoclist
113004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** points to a malloced buffer, size nDoclist bytes, containing the results
113005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of this phrase query in FTS3 doclist format. As usual, the initial
113006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "Length" field found in doclists stored on disk is omitted from this
113007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** buffer.
111939 113008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
111940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Variable pCurrent always points to the start of a docid field within
111941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** aDoclist. Since the doclist is usually scanned in docid order, this can
111942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** be used to accelerate seeking to the required docid within the doclist.
113009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Variable aMI is used only for FTSQUERY_NEAR nodes to store the global
113010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** matchinfo data. If it is not NULL, it points to an array of size nCol*3,
113011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** where nCol is the number of columns in the queried FTS table. The array
113012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is populated as follows:
113013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
113014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** aMI[iCol*3 + 0] = Undefined
113015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** aMI[iCol*3 + 1] = Number of occurrences
113016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** aMI[iCol*3 + 2] = Number of rows containing at least one instance
113017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
113018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The aMI array is allocated using sqlite3_malloc(). It should be freed
113019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** when the expression node is.
111943 113020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
111944 113021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Fts3Expr {
111945 113022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int eType; /* One of the FTSQUERY_XXX values defined below */
111946 113023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nNear; /* Valid if eType==FTSQUERY_NEAR */
111947 113024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Expr *pParent; /* pParent->pLeft==this or pParent->pRight==this */
111948 113025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Expr *pLeft; /* Left operand */
111949 113026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Expr *pRight; /* Right operand */
111950 113027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Phrase *pPhrase; /* Valid if eType==FTSQUERY_PHRASE */
111951 113028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int isLoaded; /* True if aDoclist/nDoclist are initialized. */
111953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aDoclist; /* Buffer containing doclist */
111954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nDoclist; /* Size of aDoclist in bytes */
113029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The following are used by the fts3_eval.c module. */
113030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iDocid; /* Current docid */
113031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 bEof; /* True this expression is at EOF already */
113032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 bStart; /* True if iDocid is valid */
113033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 bDeferred; /* True if this expression is entirely deferred */
111955 113034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 iCurrent;
111957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pCurrent;
113035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *aMI;
111958 113036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
111959 113037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111960 113038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
111961 113039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Candidate values for Fts3Query.eType. Note that the order of the first
111962 113040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** four values is in order of precedence when parsing expressions. For
@@ -111980,35 +113058,36 @@
111980 113058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *);
111981 113059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *);
111982 113060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *);
111983 113061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3SegReaderNew(int, sqlite3_int64,
111984 113062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64, sqlite3_int64, const char *, int, Fts3SegReader**);
111985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3SegReaderPending(Fts3Table*,const char*,int,int,Fts3SegReader**);
113063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3SegReaderPending(
113064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table*,int,const char*,int,int,Fts3SegReader**);
111986 113065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *);
111987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3SegReaderCost(Fts3Cursor *, Fts3SegReader *, int *);
111988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3AllSegdirs(Fts3Table*, int, sqlite3_stmt **);
113066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3AllSegdirs(Fts3Table*, int, int, sqlite3_stmt **);
111989 113067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3ReadLock(Fts3Table *);
111990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3ReadBlock(Fts3Table*, sqlite3_int64, char **, int*);
113068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3ReadBlock(Fts3Table*, sqlite3_int64, char **, int*, int*);
111991 113069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111992 113070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3SelectDoctotal(Fts3Table *, sqlite3_stmt **);
111993 113071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3SelectDocsize(Fts3Table *, sqlite3_int64, sqlite3_stmt **);
111994 113072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
111995 113073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Fts3FreeDeferredTokens(Fts3Cursor *);
111996 113074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3DeferToken(Fts3Cursor *, Fts3PhraseToken *, int);
111997 113075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3CacheDeferredDoclists(Fts3Cursor *);
111998 113076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Fts3FreeDeferredDoclists(Fts3Cursor *);
111999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE char *sqlite3Fts3DeferredDoclist(Fts3DeferredToken *, int *);
112000 113077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Fts3SegmentsClose(Fts3Table *);
112001 113078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define FTS3_SEGCURSOR_PENDING -1
112003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define FTS3_SEGCURSOR_ALL -2
113079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Special values interpreted by sqlite3SegReaderCursor() */
113080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define FTS3_SEGCURSOR_PENDING -1
113081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define FTS3_SEGCURSOR_ALL -2
112004 113082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3SegReaderStart(Fts3Table*, Fts3SegReaderCursor*, Fts3SegFilter*);
112006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3SegReaderStep(Fts3Table *, Fts3SegReaderCursor *);
112007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish(Fts3SegReaderCursor *);
113083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3SegReaderStart(Fts3Table*, Fts3MultiSegReader*, Fts3SegFilter*);
113084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3SegReaderStep(Fts3Table *, Fts3MultiSegReader *);
113085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish(Fts3MultiSegReader *);
113086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
112008 113087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor(
112009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Table *, int, const char *, int, int, int, Fts3SegReaderCursor *);
113088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *, int, int, const char *, int, int, int, Fts3MultiSegReader *);
112010 113089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112011 113090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Flags allowed as part of the 4th argument to SegmentReaderIterate() */
112012 113091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define FTS3_SEGMENT_REQUIRE_POS 0x00000001
112013 113092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define FTS3_SEGMENT_IGNORE_EMPTY 0x00000002
112014 113093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define FTS3_SEGMENT_COLUMN_FILTER 0x00000004
@@ -112021,21 +113100,25 @@
112021 113100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nTerm;
112022 113101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iCol;
112023 113102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int flags;
112024 113103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
112025 113104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct Fts3SegReaderCursor {
113105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Fts3MultiSegReader {
112027 113106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Used internally by sqlite3Fts3SegReaderXXX() calls */
112028 113107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3SegReader **apSegment; /* Array of Fts3SegReader objects */
112029 113108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nSegment; /* Size of apSegment array */
112030 113109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nAdvance; /* How many seg-readers to advance */
112031 113110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3SegFilter *pFilter; /* Pointer to filter object */
112032 113111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aBuffer; /* Buffer to merge doclists in */
112033 113112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nBuffer; /* Allocated size of aBuffer[] in bytes */
112034 113113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Cost of running this iterator. Used by fts3.c only. */
112036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nCost;
113114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iColFilter; /* If >=0, filter for this column */
113115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bRestart;
113116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Used by fts3.c only. */
113118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nCost; /* Cost of running iterator */
113119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bLookup; /* True if a lookup of a single entry. */
112037 113120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112038 113121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Output values. Valid only after Fts3SegReaderStep() returns SQLITE_ROW. */
112039 113122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zTerm; /* Pointer to term buffer */
112040 113123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nTerm; /* Size of zTerm in bytes */
112041 113124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aDoclist; /* Pointer to doclist buffer */
@@ -112046,15 +113129,13 @@
112046 113129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3PutVarint(char *, sqlite3_int64);
112047 113130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3GetVarint(const char *, sqlite_int64 *);
112048 113131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3GetVarint32(const char *, int *);
112049 113132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3VarintLen(sqlite3_uint64);
112050 113133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Fts3Dequote(char *);
113134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3Fts3DoclistPrev(int,char*,int,char**,sqlite3_int64*,int*,u8*);
112051 113135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE char *sqlite3Fts3FindPositions(Fts3Cursor *, Fts3Expr *, sqlite3_int64, int);
112053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3ExprLoadDoclist(Fts3Cursor *, Fts3Expr *);
112054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3ExprLoadFtDoclist(Fts3Cursor *, Fts3Expr *, char **, int *);
112055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3ExprNearTrim(Fts3Expr *, Fts3Expr *, int);
113136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats(Fts3Cursor *, Fts3Expr *, u32 *);
112056 113137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112057 113138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* fts3_tokenizer.c */
112058 113139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE const char *sqlite3Fts3NextToken(const char *, int *);
112059 113140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3InitHashTable(sqlite3 *, Fts3Hash *, const char *);
112060 113141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3InitTokenizer(Fts3Hash *pHash, const char *,
@@ -112080,20 +113161,43 @@
112080 113161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
112081 113162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112082 113163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* fts3_aux.c */
112083 113164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3InitAux(sqlite3 *db);
112084 113165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3Fts3EvalPhraseCleanup(Fts3Phrase *);
113167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3MsrIncrStart(
113169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table*, Fts3MultiSegReader*, int, const char*, int);
113170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext(
113171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *, Fts3MultiSegReader *, sqlite3_int64 *, char **, int *);
113172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE char *sqlite3Fts3EvalPhrasePoslist(Fts3Cursor *, Fts3Expr *, int iCol);
113173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3MsrOvfl(Fts3Cursor *, Fts3MultiSegReader *, int *);
113174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr);
113175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList(Fts3DeferredToken *, char **, int *);
113177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif /* !SQLITE_CORE || SQLITE_ENABLE_FTS3 */
112085 113179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif /* _FTSINT_H */
112086 113180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112087 113181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** End of fts3Int.h *********************************************/
112088 113182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/************** Continuing where we left off in fts3.c ***********************/
113183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
113184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #if defined(SQLITE_ENABLE_FTS3) && !defined(SQLITE_CORE)
113186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define SQLITE_CORE 1
113187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
112089 113188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112090 113189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112091 113190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifndef SQLITE_CORE
112092 113191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_EXTENSION_INIT1
112093 113192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
112094 113193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalNext(Fts3Cursor *pCsr);
113195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalStart(Fts3Cursor *pCsr);
113196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3TermSegReaderCursor(
113197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *, const char *, int, int, Fts3MultiSegReader **);
113198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
112095 113199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
112096 113200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Write a 64-bit variable-length integer to memory starting at p[0].
112097 113201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The length of data written will be between 1 and FTS3_VARINT_MAX bytes.
112098 113202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The number of bytes written is returned.
112099 113203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -112200,16 +113304,16 @@
112200 113304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112201 113305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
112202 113306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** When this function is called, *pp points to the first byte following a
112203 113307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** varint that is part of a doclist (or position-list, or any other list
112204 113308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of varints). This function moves *pp to point to the start of that varint,
112205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** and decrements the value stored in *pVal by the varint value.
113309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and sets *pVal by the varint value.
112206 113310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
112207 113311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Argument pStart points to the first byte of the doclist that the
112208 113312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** varint is part of.
112209 113313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
112210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void fts3GetReverseDeltaVarint(
113314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3GetReverseVarint(
112211 113315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char **pp,
112212 113316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *pStart,
112213 113317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 *pVal
112214 113318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
112215 113319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iVal;
@@ -112221,25 +113325,11 @@
112221 113325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(p = (*pp)-2; p>=pStart && *p&0x80; p--);
112222 113326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p++;
112223 113327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pp = p;
112224 113328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112225 113329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3GetVarint(p, &iVal);
112226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pVal -= iVal;
112227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
112228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
112229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
112230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** As long as *pp has not reached its end (pEnd), then do the same
112231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** as fts3GetDeltaVarint(): read a single varint and add it to *pVal.
112232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** But if we have reached the end of the varint, just set *pp=0 and
112233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** leave *pVal unchanged.
112234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
112235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void fts3GetDeltaVarint2(char **pp, char *pEnd, sqlite3_int64 *pVal){
112236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( *pp>=pEnd ){
112237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pp = 0;
112238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
112239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint(pp, pVal);
112240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pVal = iVal;
112241 113331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112242 113332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112243 113333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
112244 113334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** The xDisconnect() virtual table method.
112245 113335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -112436,10 +113526,13 @@
112436 113526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3_prepare(p->db, zSql, -1, &pStmt, 0);
112437 113527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
112438 113528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_step(pStmt);
112439 113529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nPgsz = sqlite3_column_int(pStmt, 0);
112440 113530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3_finalize(pStmt);
113531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( rc==SQLITE_AUTH ){
113532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nPgsz = 1024;
113533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_OK;
112441 113534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112442 113535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112443 113536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->nPgsz>0 || rc!=SQLITE_OK );
112444 113537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(zSql);
112445 113538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pRc = rc;
@@ -112608,10 +113701,91 @@
112608 113701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fts3Appendf(pRc, &zRet, ",%s(?)", zFunction);
112609 113702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112610 113703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(zFree);
112611 113704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return zRet;
112612 113705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
113708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function interprets the string at (*pp) as a non-negative integer
113709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** value. It reads the integer and sets *pnOut to the value read, then
113710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sets *pp to point to the byte immediately following the last byte of
113711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the integer value.
113712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
113713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Only decimal digits ('0'..'9') may be part of an integer value.
113714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
113715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If *pp does not being with a decimal digit SQLITE_ERROR is returned and
113716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the output value undefined. Otherwise SQLITE_OK is returned.
113717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
113718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is used when parsing the "prefix=" FTS4 parameter.
113719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
113720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3GobbleInt(const char **pp, int *pnOut){
113721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *p = *pp; /* Iterator pointer */
113722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nInt = 0; /* Output value */
113723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(p=*pp; p[0]>='0' && p[0]<='9'; p++){
113725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nInt = nInt * 10 + (p[0] - '0');
113726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p==*pp ) return SQLITE_ERROR;
113728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnOut = nInt;
113729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp = p;
113730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
113731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
113734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called to allocate an array of Fts3Index structures
113735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** representing the indexes maintained by the current FTS table. FTS tables
113736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** always maintain the main "terms" index, but may also maintain one or
113737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** more "prefix" indexes, depending on the value of the "prefix=" parameter
113738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (if any) specified as part of the CREATE VIRTUAL TABLE statement.
113739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
113740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Argument zParam is passed the value of the "prefix=" option if one was
113741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** specified, or NULL otherwise.
113742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
113743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If no error occurs, SQLITE_OK is returned and *apIndex set to point to
113744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the allocated array. *pnIndex is set to the number of elements in the
113745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** array. If an error does occur, an SQLite error code is returned.
113746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
113747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Regardless of whether or not an error is returned, it is the responsibility
113748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the caller to call sqlite3_free() on the output array to free it.
113749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
113750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3PrefixParameter(
113751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zParam, /* ABC in prefix=ABC parameter to parse */
113752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pnIndex, /* OUT: size of *apIndex[] array */
113753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Fts3Index **apIndex /* OUT: Array of indexes for this table */
113754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
113755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Fts3Index *aIndex; /* Allocated array */
113756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nIndex = 1; /* Number of entries in array */
113757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zParam && zParam[0] ){
113759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *p;
113760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nIndex++;
113761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(p=zParam; *p; p++){
113762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *p==',' ) nIndex++;
113763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aIndex = sqlite3_malloc(sizeof(struct Fts3Index) * nIndex);
113767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *apIndex = aIndex;
113768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnIndex = nIndex;
113769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !aIndex ){
113770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_NOMEM;
113771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(aIndex, 0, sizeof(struct Fts3Index) * nIndex);
113774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( zParam ){
113775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *p = zParam;
113776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
113777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=1; i<nIndex; i++){
113778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nPrefix;
113779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fts3GobbleInt(&p, &nPrefix) ) return SQLITE_ERROR;
113780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aIndex[i].nPrefix = nPrefix;
113781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p++;
113782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
113786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
112613 113787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112614 113788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
112615 113789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function is the implementation of both the xConnect and xCreate
112616 113790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** methods of the FTS3 virtual table.
112617 113791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -112641,16 +113815,22 @@
112641 113815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nCol = 0; /* Number of columns in the FTS table */
112642 113816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zCsr; /* Space for holding column names */
112643 113817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nDb; /* Bytes required to hold database name */
112644 113818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nName; /* Bytes required to hold table name */
112645 113819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isFts4 = (argv[0][3]=='4'); /* True for FTS4, false for FTS3 */
112646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int bNoDocsize = 0; /* True to omit %_docsize table */
112647 113820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char **aCol; /* Array of column names */
112648 113821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_tokenizer *pTokenizer = 0; /* Tokenizer for this table */
112649 113822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zCompress = 0;
112651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zUncompress = 0;
113823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nIndex; /* Size of aIndex[] array */
113824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Fts3Index *aIndex = 0; /* Array of indexes for this table */
113825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The results of parsing supported FTS4 key=value options: */
113827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bNoDocsize = 0; /* True to omit %_docsize table */
113828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bDescIdx = 0; /* True to store descending indexes */
113829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zPrefix = 0; /* Prefix parameter value (or NULL) */
113830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zCompress = 0; /* compress=? parameter (or NULL) */
113831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zUncompress = 0; /* uncompress=? parameter (or NULL) */
112652 113832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112653 113833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( strlen(argv[0])==4 );
112654 113834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( (sqlite3_strnicmp(argv[0], "fts4", 4)==0 && isFts4)
112655 113835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| (sqlite3_strnicmp(argv[0], "fts3", 4)==0 && !isFts4)
112656 113836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
@@ -112687,32 +113867,76 @@
112687 113867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3Fts3InitTokenizer(pHash, &z[9], &pTokenizer, pzErr);
112688 113868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112689 113869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112690 113870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check if it is an FTS4 special argument. */
112691 113871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
else if( isFts4 && fts3IsSpecialColumn(z, &nKey, &zVal) ){
113872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Fts4Option {
113873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zOpt;
113874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nOpt;
113875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char **pzVar;
113876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } aFts4Opt[] = {
113877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "matchinfo", 9, 0 }, /* 0 -> MATCHINFO */
113878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "prefix", 6, 0 }, /* 1 -> PREFIX */
113879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "compress", 8, 0 }, /* 2 -> COMPRESS */
113880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "uncompress", 10, 0 }, /* 3 -> UNCOMPRESS */
113881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ { "order", 5, 0 } /* 4 -> ORDER */
113882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
113883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iOpt;
112692 113885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !zVal ){
112693 113886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_NOMEM;
112694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto fts3_init_out;
112695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
112696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nKey==9 && 0==sqlite3_strnicmp(z, "matchinfo", 9) ){
112697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( strlen(zVal)==4 && 0==sqlite3_strnicmp(zVal, "fts3", 4) ){
112698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- bNoDocsize = 1;
112699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
112700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pzErr = sqlite3_mprintf("unrecognized matchinfo: %s", zVal);
112701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_ERROR;
112702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
112703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( nKey==8 && 0==sqlite3_strnicmp(z, "compress", 8) ){
112704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zCompress = zVal;
112705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zVal = 0;
112706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( nKey==10 && 0==sqlite3_strnicmp(z, "uncompress", 10) ){
112707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zUncompress = zVal;
112708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zVal = 0;
112709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
112710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pzErr = sqlite3_mprintf("unrecognized parameter: %s", z);
112711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_ERROR;
112712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
112713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(zVal);
113887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
113888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iOpt=0; iOpt<SizeofArray(aFts4Opt); iOpt++){
113889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Fts4Option *pOp = &aFts4Opt[iOpt];
113890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nKey==pOp->nOpt && !sqlite3_strnicmp(z, pOp->zOpt, pOp->nOpt) ){
113891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
113892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iOpt==SizeofArray(aFts4Opt) ){
113895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pzErr = sqlite3_mprintf("unrecognized parameter: %s", z);
113896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_ERROR;
113897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
113898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( iOpt ){
113899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 0: /* MATCHINFO */
113900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "fts3", 4) ){
113901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pzErr = sqlite3_mprintf("unrecognized matchinfo: %s", zVal);
113902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_ERROR;
113903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bNoDocsize = 1;
113905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
113906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 1: /* PREFIX */
113908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(zPrefix);
113909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zPrefix = zVal;
113910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zVal = 0;
113911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
113912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 2: /* COMPRESS */
113914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(zCompress);
113915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zCompress = zVal;
113916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zVal = 0;
113917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
113918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 3: /* UNCOMPRESS */
113920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(zUncompress);
113921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zUncompress = zVal;
113922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zVal = 0;
113923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
113924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case 4: /* ORDER */
113926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (strlen(zVal)!=3 || sqlite3_strnicmp(zVal, "asc", 3))
113927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (strlen(zVal)!=4 || sqlite3_strnicmp(zVal, "desc", 3))
113928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
113929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pzErr = sqlite3_mprintf("unrecognized order: %s", zVal);
113930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_ERROR;
113931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bDescIdx = (zVal[0]=='d' || zVal[0]=='D');
113933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
113934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(zVal);
113937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
112714 113938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112715 113939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112716 113940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Otherwise, the argument is a column name. */
112717 113941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
else {
112718 113942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nString += (int)(strlen(z) + 1);
@@ -112732,14 +113956,21 @@
112732 113956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3Fts3InitTokenizer(pHash, "simple", &pTokenizer, pzErr);
112733 113957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) goto fts3_init_out;
112734 113958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112735 113959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pTokenizer );
112736 113960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3PrefixParameter(zPrefix, &nIndex, &aIndex);
113962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_ERROR ){
113963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( zPrefix );
113964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pzErr = sqlite3_mprintf("error parsing prefix parameter: %s", zPrefix);
113965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) goto fts3_init_out;
112737 113967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112738 113968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Allocate and populate the Fts3Table structure. */
112739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nByte = sizeof(Fts3Table) + /* Fts3Table */
113969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nByte = sizeof(Fts3Table) + /* Fts3Table */
112740 113970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nCol * sizeof(char *) + /* azColumn */
113971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nIndex * sizeof(struct Fts3Index) + /* aIndex */
112741 113972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nName + /* zName */
112742 113973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nDb + /* zDb */
112743 113974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nString; /* Space for azColumn strings */
112744 113975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p = (Fts3Table*)sqlite3_malloc(nByte);
112745 113976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p==0 ){
@@ -112750,20 +113981,26 @@
112750 113981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->db = db;
112751 113982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nColumn = nCol;
112752 113983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nPendingData = 0;
112753 113984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->azColumn = (char **)&p[1];
112754 113985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pTokenizer = pTokenizer;
112755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->nNodeSize = 1000;
112756 113986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nMaxPendingData = FTS3_MAX_PENDING_DATA;
112757 113987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->bHasDocsize = (isFts4 && bNoDocsize==0);
112758 113988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->bHasStat = isFts4;
113989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->bDescIdx = bDescIdx;
112759 113990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TESTONLY( p->inTransaction = -1 );
112760 113991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TESTONLY( p->mxSavepoint = -1 );
112761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3HashInit(&p->pendingTerms, FTS3_HASH_STRING, 1);
113992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->aIndex = (struct Fts3Index *)&p->azColumn[nCol];
113994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(p->aIndex, aIndex, sizeof(struct Fts3Index) * nIndex);
113995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nIndex = nIndex;
113996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<nIndex; i++){
113997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3HashInit(&p->aIndex[i].hPending, FTS3_HASH_STRING, 1);
113998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
112762 113999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112763 114000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Fill in the zName and zDb fields of the vtab structure. */
112764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zCsr = (char *)&p->azColumn[nCol];
114001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zCsr = (char *)&p->aIndex[nIndex];
112765 114002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->zName = zCsr;
112766 114003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(zCsr, argv[2], nName);
112767 114004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zCsr += nName;
112768 114005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->zDb = zCsr;
112769 114006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(zCsr, argv[1], nDb);
@@ -112770,11 +114007,11 @@
112770 114007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zCsr += nDb;
112771 114008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112772 114009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Fill in the azColumn array */
112773 114010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(iCol=0; iCol<nCol; iCol++){
112774 114011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *z;
112775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n;
114012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = 0;
112776 114013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
z = (char *)sqlite3Fts3NextToken(aCol[iCol], &n);
112777 114014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(zCsr, z, n);
112778 114015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zCsr[n] = '\0';
112779 114016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3Dequote(zCsr);
112780 114017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->azColumn[iCol] = zCsr;
@@ -112797,19 +114034,20 @@
112797 114034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isCreate ){
112798 114035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = fts3CreateTables(p);
112799 114036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112800 114037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112801 114038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Figure out the page-size for the database. This is required in order to
112802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** estimate the cost of loading large doclists from the database (see
112803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** function sqlite3Fts3SegReaderCost() for details).
112804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** estimate the cost of loading large doclists from the database. */
112805 114040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fts3DatabasePageSize(&rc, p);
114041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nNodeSize = p->nPgsz-35;
112806 114042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112807 114043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Declare the table schema to SQLite. */
112808 114044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fts3DeclareVtab(&rc, p);
112809 114045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112810 114046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fts3_init_out:
114047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(zPrefix);
114048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(aIndex);
112811 114049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(zCompress);
112812 114050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(zUncompress);
112813 114051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free((void *)aCol);
112814 114052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
112815 114053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p ){
@@ -112816,10 +114054,11 @@
112816 114054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fts3DisconnectMethod((sqlite3_vtab *)p);
112817 114055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( pTokenizer ){
112818 114056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTokenizer->pModule->xDestroy(pTokenizer);
112819 114057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112820 114058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
114059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p->pSegments==0 );
112821 114060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*ppVTab = &p->base;
112822 114061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112823 114062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
112824 114063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112825 114064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -112913,14 +114152,15 @@
112913 114152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pOrder->desc ){
112914 114153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pInfo->idxStr = "DESC";
112915 114154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
112916 114155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pInfo->idxStr = "ASC";
112917 114156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pInfo->orderByConsumed = 1;
112918 114158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pInfo->orderByConsumed = 1;
112920 114159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112921 114160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p->pSegments==0 );
112922 114162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
112923 114163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112924 114164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112925 114165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
112926 114166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Implementation of xOpen method.
@@ -112952,10 +114192,11 @@
112952 114192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_finalize(pCsr->pStmt);
112953 114193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3ExprFree(pCsr->pExpr);
112954 114194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3FreeDeferredTokens(pCsr);
112955 114195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pCsr->aDoclist);
112956 114196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pCsr->aMatchinfo);
114197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 );
112957 114198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pCsr);
112958 114199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
112959 114200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
112960 114201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
112961 114202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -112963,12 +114204,12 @@
112963 114204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of the %_content table that contains the last match. Return
112964 114205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SQLITE_OK on success.
112965 114206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
112966 114207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3CursorSeek(sqlite3_context *pContext, Fts3Cursor *pCsr){
112967 114208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pCsr->isRequireSeek ){
112968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->isRequireSeek = 0;
112969 114209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_bind_int64(pCsr->pStmt, 1, pCsr->iPrevId);
114210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->isRequireSeek = 0;
112970 114211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( SQLITE_ROW==sqlite3_step(pCsr->pStmt) ){
112971 114212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
112972 114213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
112973 114214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = sqlite3_reset(pCsr->pStmt);
112974 114215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
@@ -113145,21 +114386,21 @@
113145 114386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK && iHeight>1 ){
113146 114387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zBlob = 0; /* Blob read from %_segments table */
113147 114388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nBlob; /* Size of zBlob in bytes */
113148 114389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113149 114390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( piLeaf && piLeaf2 && (*piLeaf!=*piLeaf2) ){
113150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3ReadBlock(p, *piLeaf, &zBlob, &nBlob);
114391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3ReadBlock(p, *piLeaf, &zBlob, &nBlob, 0);
113151 114392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
113152 114393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, 0);
113153 114394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113154 114395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(zBlob);
113155 114396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
piLeaf = 0;
113156 114397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zBlob = 0;
113157 114398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113158 114399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113159 114400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
113160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3ReadBlock(p, piLeaf ? *piLeaf : *piLeaf2, &zBlob, &nBlob);
114401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3ReadBlock(p, piLeaf?*piLeaf:*piLeaf2, &zBlob, &nBlob, 0);
113161 114402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113162 114403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
113163 114404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = fts3SelectLeaf(p, zTerm, nTerm, zBlob, nBlob, piLeaf, piLeaf2);
113164 114405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113165 114406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(zBlob);
@@ -113393,12 +114634,10 @@
113393 114634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pp1 = p1 + 1;
113394 114635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pp2 = p2 + 1;
113395 114636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113396 114637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113397 114638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
113398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** nToken==1 searches for adjacent positions.
113399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
113400 114639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function is used to merge two position lists into one. When it is
113401 114640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** called, *pp1 and *pp2 must both point to position lists. A position-list is
113402 114641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the part of a doclist that follows each document id. For example, if a row
113403 114642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** contains:
113404 114643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -113414,10 +114653,12 @@
113414 114653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If isSaveLeft is 0, an entry is added to the output position list for
113415 114654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** each position in *pp2 for which there exists one or more positions in
113416 114655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** *pp1 so that (pos(*pp2)>pos(*pp1) && pos(*pp2)-pos(*pp1)<=nToken). i.e.
113417 114656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** when the *pp1 token appears before the *pp2 token, but not more than nToken
113418 114657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** slots before it.
114658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** e.g. nToken==1 searches for adjacent positions.
113419 114660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
113420 114661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3PoslistPhraseMerge(
113421 114662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char **pp, /* IN/OUT: Preallocated output buffer */
113422 114663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nToken, /* Maximum difference in token positions */
113423 114664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isSaveLeft, /* Save the left position */
@@ -113531,11 +114772,23 @@
113531 114772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pp = p;
113532 114773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
113533 114774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113534 114775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113535 114776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
113536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Merge two position-lists as required by the NEAR operator.
114777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Merge two position-lists as required by the NEAR operator. The argument
114778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** position lists correspond to the left and right phrases of an expression
114779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** like:
114780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "phrase 1" NEAR "phrase number 2"
114782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Position list *pp1 corresponds to the left-hand side of the NEAR
114784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expression and *pp2 to the right. As usual, the indexes in the position
114785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** lists are the offsets of the last token in each phrase (tokens "1" and "2"
114786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** in the example above).
114787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The output position list - written to *pp - is a copy of *pp2 with those
114789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** entries that are not sufficiently NEAR entries in *pp1 removed.
113537 114790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
113538 114791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3PoslistNearMerge(
113539 114792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char **pp, /* Output buffer */
113540 114793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aTmp, /* Temporary buffer space */
113541 114794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nRight, /* Maximum difference in token positions */
@@ -113544,230 +114797,248 @@
113544 114797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char **pp2 /* IN/OUT: Right input list */
113545 114798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
113546 114799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *p1 = *pp1;
113547 114800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *p2 = *pp2;
113548 114801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !pp ){
113550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( fts3PoslistPhraseMerge(0, nRight, 0, 0, pp1, pp2) ) return 1;
113551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pp1 = p1;
113552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pp2 = p2;
113553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return fts3PoslistPhraseMerge(0, nLeft, 0, 0, pp2, pp1);
113554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
113555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pTmp1 = aTmp;
113556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pTmp2;
113557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aTmp2;
113558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int res = 1;
113559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PoslistPhraseMerge(&pTmp1, nRight, 0, 0, pp1, pp2);
113561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aTmp2 = pTmp2 = pTmp1;
113562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pp1 = p1;
113563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pp2 = p2;
113564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PoslistPhraseMerge(&pTmp2, nLeft, 1, 0, pp2, pp1);
113565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pTmp1!=aTmp && pTmp2!=aTmp2 ){
113566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PoslistMerge(pp, &aTmp, &aTmp2);
113567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( pTmp1!=aTmp ){
113568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PoslistCopy(pp, &aTmp);
113569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( pTmp2!=aTmp2 ){
113570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PoslistCopy(pp, &aTmp2);
113571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
113572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- res = 0;
113573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return res;
113576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
113580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Values that may be used as the first parameter to fts3DoclistMerge().
113581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
113582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define MERGE_NOT 2 /* D + D -> D */
113583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define MERGE_AND 3 /* D + D -> D */
113584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define MERGE_OR 4 /* D + D -> D */
113585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define MERGE_POS_OR 5 /* P + P -> P */
113586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define MERGE_PHRASE 6 /* P + P -> D */
113587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define MERGE_POS_PHRASE 7 /* P + P -> P */
113588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define MERGE_NEAR 8 /* P + P -> D */
113589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define MERGE_POS_NEAR 9 /* P + P -> P */
113590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
113592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Merge the two doclists passed in buffer a1 (size n1 bytes) and a2
113593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** (size n2 bytes). The output is written to pre-allocated buffer aBuffer,
113594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** which is guaranteed to be large enough to hold the results. The number
113595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of bytes written to aBuffer is stored in *pnBuffer before returning.
113596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
113597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If successful, SQLITE_OK is returned. Otherwise, if a malloc error
113598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** occurs while allocating a temporary buffer as part of the merge operation,
113599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** SQLITE_NOMEM is returned.
113600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
113601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3DoclistMerge(
113602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int mergetype, /* One of the MERGE_XXX constants */
113603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nParam1, /* Used by MERGE_NEAR and MERGE_POS_NEAR */
113604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nParam2, /* Used by MERGE_NEAR and MERGE_POS_NEAR */
113605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aBuffer, /* Pre-allocated output buffer */
113606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pnBuffer, /* OUT: Bytes written to aBuffer */
113607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *a1, /* Buffer containing first doclist */
113608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n1, /* Size of buffer a1 */
113609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *a2, /* Buffer containing second doclist */
113610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n2, /* Size of buffer a2 */
113611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pnDoc /* OUT: Number of docids in output */
114802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pTmp1 = aTmp;
114803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pTmp2;
114804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aTmp2;
114805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int res = 1;
114806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistPhraseMerge(&pTmp1, nRight, 0, 0, pp1, pp2);
114808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aTmp2 = pTmp2 = pTmp1;
114809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp1 = p1;
114810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp2 = p2;
114811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistPhraseMerge(&pTmp2, nLeft, 1, 0, pp2, pp1);
114812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pTmp1!=aTmp && pTmp2!=aTmp2 ){
114813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistMerge(pp, &aTmp, &aTmp2);
114814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( pTmp1!=aTmp ){
114815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistCopy(pp, &aTmp);
114816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( pTmp2!=aTmp2 ){
114817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistCopy(pp, &aTmp2);
114818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
114819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ res = 0;
114820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
114821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return res;
114823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
114824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
114826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** An instance of this function is used to merge together the (potentially
114827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** large number of) doclists for each term that matches a prefix query.
114828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** See function fts3TermSelectMerge() for details.
114829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
114830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct TermSelect TermSelect;
114831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct TermSelect {
114832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aaOutput[16]; /* Malloc'd output buffers */
114833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int anOutput[16]; /* Size each output buffer in bytes */
114834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
114835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
114837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is used to read a single varint from a buffer. Parameter
114838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pEnd points 1 byte past the end of the buffer. When this function is
114839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** called, if *pp points to pEnd or greater, then the end of the buffer
114840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** has been reached. In this case *pp is set to 0 and the function returns.
114841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If *pp does not point to or past pEnd, then a single varint is read
114843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** from *pp. *pp is then set to point 1 byte past the end of the read varint.
114844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If bDescIdx is false, the value read is added to *pVal before returning.
114846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If it is true, the value read is subtracted from *pVal before this
114847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** function returns.
114848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
114849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3GetDeltaVarint3(
114850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char **pp, /* IN/OUT: Point to read varint from */
114851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pEnd, /* End of buffer */
114852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bDescIdx, /* True if docids are descending */
114853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 *pVal /* IN/OUT: Integer value */
114854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
114855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *pp>=pEnd ){
114856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp = 0;
114857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
114858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iVal;
114859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp += sqlite3Fts3GetVarint(*pp, &iVal);
114860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bDescIdx ){
114861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pVal -= iVal;
114862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
114863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pVal += iVal;
114864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
114865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
114866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
114867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
114869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is used to write a single varint to a buffer. The varint
114870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is written to *pp. Before returning, *pp is set to point 1 byte past the
114871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** end of the value written.
114872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If *pbFirst is zero when this function is called, the value written to
114874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the buffer is that of parameter iVal.
114875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If *pbFirst is non-zero when this function is called, then the value
114877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** written is either (iVal-*piPrev) (if bDescIdx is zero) or (*piPrev-iVal)
114878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (if bDescIdx is non-zero).
114879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Before returning, this function always sets *pbFirst to 1 and *piPrev
114881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to the value of parameter iVal.
114882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
114883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3PutDeltaVarint3(
114884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char **pp, /* IN/OUT: Output pointer */
114885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bDescIdx, /* True for descending docids */
114886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 *piPrev, /* IN/OUT: Previous value written to list */
114887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pbFirst, /* IN/OUT: True after first int written */
114888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iVal /* Write this value to the list */
114889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
114890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iWrite;
114891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bDescIdx==0 || *pbFirst==0 ){
114892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iWrite = iVal - *piPrev;
114893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
114894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iWrite = *piPrev - iVal;
114895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
114896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( *pbFirst || *piPrev==0 );
114897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( *pbFirst==0 || iWrite>0 );
114898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pp += sqlite3Fts3PutVarint(*pp, iWrite);
114899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piPrev = iVal;
114900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pbFirst = 1;
114901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
114902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
114905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This macro is used by various functions that merge doclists. The two
114906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** arguments are 64-bit docid values. If the value of the stack variable
114907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** bDescDoclist is 0 when this macro is invoked, then it returns (i1-i2).
114908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Otherwise, (i2-i1).
114909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Using this makes it easier to write code that can merge doclists that are
114911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sorted in either ascending or descending order.
114912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
114913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define DOCID_CMP(i1, i2) ((bDescDoclist?-1:1) * (i1-i2))
114914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
114916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function does an "OR" merge of two doclists (output contains all
114917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** positions contained in either argument doclist). If the docids in the
114918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** input doclists are sorted in ascending order, parameter bDescDoclist
114919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** should be false. If they are sorted in ascending order, it should be
114920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** passed a non-zero value.
114921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If no error occurs, *paOut is set to point at an sqlite3_malloc'd buffer
114923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** containing the output doclist and SQLITE_OK is returned. In this case
114924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** *pnOut is set to the number of bytes in the output doclist.
114925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If an error occurs, an SQLite error code is returned. The output values
114927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** are undefined in this case.
114928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
114929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3DoclistOrMerge(
114930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bDescDoclist, /* True if arguments are desc */
114931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *a1, int n1, /* First doclist */
114932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *a2, int n2, /* Second doclist */
114933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char **paOut, int *pnOut /* OUT: Malloc'd doclist */
114934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
114935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 i1 = 0;
114936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 i2 = 0;
114937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iPrev = 0;
114938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pEnd1 = &a1[n1];
114939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pEnd2 = &a2[n2];
114940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p1 = a1;
114941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p2 = a2;
114942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p;
114943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aOut;
114944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bFirstOut = 0;
114945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *paOut = 0;
114947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnOut = 0;
114948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aOut = sqlite3_malloc(n1+n2);
114949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !aOut ) return SQLITE_NOMEM;
114950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p = aOut;
114952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1);
114953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2);
114954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( p1 || p2 ){
114955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iDiff = DOCID_CMP(i1, i2);
114956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p2 && p1 && iDiff==0 ){
114958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1);
114959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistMerge(&p, &p1, &p2);
114960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1);
114961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2);
114962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( !p2 || (p1 && iDiff<0) ){
114963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1);
114964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistCopy(&p, &p1);
114965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1);
114966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
114967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i2);
114968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistCopy(&p, &p2);
114969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2);
114970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
114971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
114972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *paOut = aOut;
114974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnOut = (p-aOut);
114975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
114976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
114977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
114979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function does a "phrase" merge of two doclists. In a phrase merge,
114980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the output contains a copy of each position from the right-hand input
114981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** doclist for which there is a position in the left-hand input doclist
114982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** exactly nDist tokens before it.
114983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the docids in the input doclists are sorted in ascending order,
114985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** parameter bDescDoclist should be false. If they are sorted in ascending
114986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** order, it should be passed a non-zero value.
114987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
114988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The right-hand input doclist is overwritten by this function.
114989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
114990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3DoclistPhraseMerge(
114991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bDescDoclist, /* True if arguments are desc */
114992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nDist, /* Distance from left to right (1=adjacent) */
114993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aLeft, int nLeft, /* Left doclist */
114994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aRight, int *pnRight /* IN/OUT: Right/output doclist */
113612 114995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
113613 114996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 i1 = 0;
113614 114997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 i2 = 0;
113615 114998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iPrev = 0;
113616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *p = aBuffer;
113618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *p1 = a1;
113619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *p2 = a2;
113620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pEnd1 = &a1[n1];
113621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pEnd2 = &a2[n2];
113622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nDoc = 0;
113623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( mergetype==MERGE_OR || mergetype==MERGE_POS_OR
113625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || mergetype==MERGE_AND || mergetype==MERGE_NOT
113626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || mergetype==MERGE_PHRASE || mergetype==MERGE_POS_PHRASE
113627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || mergetype==MERGE_NEAR || mergetype==MERGE_POS_NEAR
113628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
113629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !aBuffer ){
113631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnBuffer = 0;
113632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_NOMEM;
113633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Read the first docid from each doclist */
113636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p1, pEnd1, &i1);
113637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p2, pEnd2, &i2);
113638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- switch( mergetype ){
113640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case MERGE_OR:
113641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case MERGE_POS_OR:
113642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( p1 || p2 ){
113643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p2 && p1 && i1==i2 ){
113644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PutDeltaVarint(&p, &iPrev, i1);
113645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( mergetype==MERGE_POS_OR ) fts3PoslistMerge(&p, &p1, &p2);
113646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p1, pEnd1, &i1);
113647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p2, pEnd2, &i2);
113648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( !p2 || (p1 && i1<i2) ){
113649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PutDeltaVarint(&p, &iPrev, i1);
113650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( mergetype==MERGE_POS_OR ) fts3PoslistCopy(&p, &p1);
113651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p1, pEnd1, &i1);
113652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
113653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PutDeltaVarint(&p, &iPrev, i2);
113654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( mergetype==MERGE_POS_OR ) fts3PoslistCopy(&p, &p2);
113655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p2, pEnd2, &i2);
113656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
113659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case MERGE_AND:
113661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( p1 && p2 ){
113662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i1==i2 ){
113663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PutDeltaVarint(&p, &iPrev, i1);
113664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p1, pEnd1, &i1);
113665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p2, pEnd2, &i2);
113666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nDoc++;
113667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( i1<i2 ){
113668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p1, pEnd1, &i1);
113669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
113670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p2, pEnd2, &i2);
113671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
113674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case MERGE_NOT:
113676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( p1 ){
113677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p2 && i1==i2 ){
113678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p1, pEnd1, &i1);
113679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p2, pEnd2, &i2);
113680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( !p2 || i1<i2 ){
113681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PutDeltaVarint(&p, &iPrev, i1);
113682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p1, pEnd1, &i1);
113683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
113684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p2, pEnd2, &i2);
113685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
113688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case MERGE_POS_PHRASE:
113690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case MERGE_PHRASE: {
113691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char **ppPos = (mergetype==MERGE_PHRASE ? 0 : &p);
113692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( p1 && p2 ){
113693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i1==i2 ){
113694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pSave = p;
113695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 iPrevSave = iPrev;
113696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PutDeltaVarint(&p, &iPrev, i1);
113697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( 0==fts3PoslistPhraseMerge(ppPos, nParam1, 0, 1, &p1, &p2) ){
113698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p = pSave;
113699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iPrev = iPrevSave;
113700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
113701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nDoc++;
113702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p1, pEnd1, &i1);
113704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p2, pEnd2, &i2);
113705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( i1<i2 ){
113706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PoslistCopy(0, &p1);
113707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p1, pEnd1, &i1);
113708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
113709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PoslistCopy(0, &p2);
113710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p2, pEnd2, &i2);
113711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
113714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- default: assert( mergetype==MERGE_POS_NEAR || mergetype==MERGE_NEAR ); {
113717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aTmp = 0;
113718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char **ppPos = 0;
113719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( mergetype==MERGE_POS_NEAR ){
113721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ppPos = &p;
113722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aTmp = sqlite3_malloc(2*(n1+n2+1));
113723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !aTmp ){
113724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_NOMEM;
113725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( p1 && p2 ){
113729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( i1==i2 ){
113730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pSave = p;
113731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 iPrevSave = iPrev;
113732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PutDeltaVarint(&p, &iPrev, i1);
113733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !fts3PoslistNearMerge(ppPos, aTmp, nParam1, nParam2, &p1, &p2) ){
113735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iPrev = iPrevSave;
113736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p = pSave;
113737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p1, pEnd1, &i1);
113740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p2, pEnd2, &i2);
113741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( i1<i2 ){
113742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PoslistCopy(0, &p1);
113743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p1, pEnd1, &i1);
113744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
113745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PoslistCopy(0, &p2);
113746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint2(&p2, pEnd2, &i2);
113747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(aTmp);
113750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
113751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pnDoc ) *pnDoc = nDoc;
113755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnBuffer = (int)(p-aBuffer);
113756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
113757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
113760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** A pointer to an instance of this structure is used as the context
113761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** argument to sqlite3Fts3SegReaderIterate()
113762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
113763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- typedef struct TermSelect TermSelect;
113764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct TermSelect {
113765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int isReqPos;
113766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aaOutput[16]; /* Malloc'd output buffer */
113767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int anOutput[16]; /* Size of output in bytes */
113768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
114999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pEnd1 = &aLeft[nLeft];
115000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pEnd2 = &aRight[*pnRight];
115001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p1 = aLeft;
115002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p2 = aRight;
115003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p;
115004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bFirstOut = 0;
115005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aOut = aRight;
115006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( nDist>0 );
115008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p = aOut;
115010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3GetDeltaVarint3(&p1, pEnd1, 0, &i1);
115011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3GetDeltaVarint3(&p2, pEnd2, 0, &i2);
115012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( p1 && p2 ){
115014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iDiff = DOCID_CMP(i1, i2);
115015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iDiff==0 ){
115016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pSave = p;
115017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iPrevSave = iPrev;
115018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bFirstOutSave = bFirstOut;
115019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PutDeltaVarint3(&p, bDescDoclist, &iPrev, &bFirstOut, i1);
115021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( 0==fts3PoslistPhraseMerge(&p, nDist, 0, 1, &p1, &p2) ){
115022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p = pSave;
115023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iPrev = iPrevSave;
115024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bFirstOut = bFirstOutSave;
115025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1);
115027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2);
115028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( iDiff<0 ){
115029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistCopy(0, &p1);
115030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3GetDeltaVarint3(&p1, pEnd1, bDescDoclist, &i1);
115031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
115032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistCopy(0, &p2);
115033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3GetDeltaVarint3(&p2, pEnd2, bDescDoclist, &i2);
115034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnRight = p - aOut;
115038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113769 115040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113770 115041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
113771 115042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Merge all doclists in the TermSelect.aaOutput[] array into a single
113772 115043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** doclist stored in TermSelect.aaOutput[0]. If successful, delete all
113773 115044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** other doclists (except the aaOutput[0] one) and return SQLITE_OK.
@@ -113774,12 +115045,11 @@
113774 115045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
113775 115046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If an OOM error occurs, return SQLITE_NOMEM. In this case it is
113776 115047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the responsibility of the caller to free any doclists left in the
113777 115048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** TermSelect.aaOutput[] array.
113778 115049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
113779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3TermSelectMerge(TermSelect *pTS){
113780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int mergetype = (pTS->isReqPos ? MERGE_POS_OR : MERGE_OR);
115050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3TermSelectFinishMerge(Fts3Table *p, TermSelect *pTS){
113781 115051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aOut = 0;
113782 115052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nOut = 0;
113783 115053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
113784 115054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113785 115055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Loop through the doclists in the aaOutput[] array. Merge them all
@@ -113790,19 +115060,21 @@
113790 115060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !aOut ){
113791 115061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aOut = pTS->aaOutput[i];
113792 115062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nOut = pTS->anOutput[i];
113793 115063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTS->aaOutput[i] = 0;
113794 115064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
113795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nNew = nOut + pTS->anOutput[i];
113796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aNew = sqlite3_malloc(nNew);
113797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !aNew ){
115065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nNew;
115066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aNew;
115067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = fts3DoclistOrMerge(p->bDescIdx,
115069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTS->aaOutput[i], pTS->anOutput[i], aOut, nOut, &aNew, &nNew
115070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
115071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
113798 115072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(aOut);
113799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_NOMEM;
115073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
113800 115074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3DoclistMerge(mergetype, 0, 0,
113802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aNew, &nNew, pTS->aaOutput[i], pTS->anOutput[i], aOut, nOut, 0
113803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
115075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113804 115076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pTS->aaOutput[i]);
113805 115077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(aOut);
113806 115078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTS->aaOutput[i] = 0;
113807 115079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aOut = aNew;
113808 115080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nOut = nNew;
@@ -113814,288 +115086,329 @@
113814 115086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTS->anOutput[0] = nOut;
113815 115087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
113816 115088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113817 115089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113818 115090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
113819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This function is used as the sqlite3Fts3SegReaderIterate() callback when
113820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** querying the full-text index for a doclist associated with a term or
113821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** term-prefix.
115091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Merge the doclist aDoclist/nDoclist into the TermSelect object passed
115092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** as the first argument. The merge is an "OR" merge (see function
115093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fts3DoclistOrMerge() for details).
115094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
115095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called with the doclist for each term that matches
115096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a queried prefix. It merges all these doclists into one, the doclist
115097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for the specified prefix. Since there can be a very large number of
115098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** doclists to merge, the merging is done pair-wise using the TermSelect
115099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** object.
115100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
115101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function returns SQLITE_OK if the merge is successful, or an
115102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLite error code (SQLITE_NOMEM) if an error occurs.
113822 115103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
113823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3TermSelectCb(
113824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Table *p, /* Virtual table object */
113825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- void *pContext, /* Pointer to TermSelect structure */
113826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zTerm,
113827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nTerm,
113828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aDoclist,
113829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nDoclist
115104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3TermSelectMerge(
115105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *p, /* FTS table handle */
115106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ TermSelect *pTS, /* TermSelect object to merge into */
115107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aDoclist, /* Pointer to doclist */
115108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nDoclist /* Size of aDoclist in bytes */
113830 115109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
113831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- TermSelect *pTS = (TermSelect *)pContext;
113832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UNUSED_PARAMETER(p);
113834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UNUSED_PARAMETER(zTerm);
113835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UNUSED_PARAMETER(nTerm);
113836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113837 115110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTS->aaOutput[0]==0 ){
113838 115111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If this is the first term selected, copy the doclist to the output
113839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** buffer using memcpy(). TODO: Add a way to transfer control of the
113840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** aDoclist buffer from the caller so as to avoid the memcpy().
113841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
115112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** buffer using memcpy(). */
113842 115113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTS->aaOutput[0] = sqlite3_malloc(nDoclist);
113843 115114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTS->anOutput[0] = nDoclist;
113844 115115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTS->aaOutput[0] ){
113845 115116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(pTS->aaOutput[0], aDoclist, nDoclist);
113846 115117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
113847 115118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_NOMEM;
113848 115119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113849 115120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
113850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int mergetype = (pTS->isReqPos ? MERGE_POS_OR : MERGE_OR);
113851 115121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aMerge = aDoclist;
113852 115122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nMerge = nDoclist;
113853 115123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iOut;
113854 115124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113855 115125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(iOut=0; iOut<SizeofArray(pTS->aaOutput); iOut++){
113856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aNew;
113857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nNew;
113858 115126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pTS->aaOutput[iOut]==0 ){
113859 115127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( iOut>0 );
113860 115128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTS->aaOutput[iOut] = aMerge;
113861 115129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pTS->anOutput[iOut] = nMerge;
113862 115130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
113863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nNew = nMerge + pTS->anOutput[iOut];
113866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aNew = sqlite3_malloc(nNew);
113867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !aNew ){
113868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aMerge!=aDoclist ){
113869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(aMerge);
113870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_NOMEM;
113872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3DoclistMerge(mergetype, 0, 0, aNew, &nNew,
113874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTS->aaOutput[iOut], pTS->anOutput[iOut], aMerge, nMerge, 0
113875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
113876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iOut>0 ) sqlite3_free(aMerge);
113878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(pTS->aaOutput[iOut]);
113879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTS->aaOutput[iOut] = 0;
113880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aMerge = aNew;
113882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nMerge = nNew;
113883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (iOut+1)==SizeofArray(pTS->aaOutput) ){
113884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTS->aaOutput[iOut] = aMerge;
113885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTS->anOutput[iOut] = nMerge;
113886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
113890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3DeferredTermSelect(
113893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3DeferredToken *pToken, /* Phrase token */
113894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int isTermPos, /* True to include positions */
113895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pnOut, /* OUT: Size of list */
113896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char **ppOut /* OUT: Body of list */
113897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
113898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aSource;
113899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nSource;
113900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aSource = sqlite3Fts3DeferredDoclist(pToken, &nSource);
113902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !aSource ){
113903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnOut = 0;
113904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *ppOut = 0;
113905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( isTermPos ){
113906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *ppOut = sqlite3_malloc(nSource);
113907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !*ppOut ) return SQLITE_NOMEM;
113908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memcpy(*ppOut, aSource, nSource);
113909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnOut = nSource;
113910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
113911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 docid;
113912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnOut = sqlite3Fts3GetVarint(aSource, &docid);
113913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *ppOut = sqlite3_malloc(*pnOut);
113914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !*ppOut ) return SQLITE_NOMEM;
113915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3Fts3PutVarint(*ppOut, docid);
113916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
113919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor(
115131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
115132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aNew;
115133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nNew;
115134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = fts3DoclistOrMerge(p->bDescIdx, aMerge, nMerge,
115136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTS->aaOutput[iOut], pTS->anOutput[iOut], &aNew, &nNew
115137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
115138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
115139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aMerge!=aDoclist ) sqlite3_free(aMerge);
115140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
115141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aMerge!=aDoclist ) sqlite3_free(aMerge);
115144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pTS->aaOutput[iOut]);
115145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTS->aaOutput[iOut] = 0;
115146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aMerge = aNew;
115148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nMerge = nNew;
115149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (iOut+1)==SizeofArray(pTS->aaOutput) ){
115150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTS->aaOutput[iOut] = aMerge;
115151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTS->anOutput[iOut] = nMerge;
115152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
115157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
115160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Append SegReader object pNew to the end of the pCsr->apSegment[] array.
115161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
115162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3SegReaderCursorAppend(
115163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pCsr,
115164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3SegReader *pNew
115165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
115166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (pCsr->nSegment%16)==0 ){
115167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3SegReader **apNew;
115168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*);
115169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ apNew = (Fts3SegReader **)sqlite3_realloc(pCsr->apSegment, nByte);
115170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !apNew ){
115171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Fts3SegReaderFree(pNew);
115172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_NOMEM;
115173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->apSegment = apNew;
115175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->apSegment[pCsr->nSegment++] = pNew;
115177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
115178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
115181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Add seg-reader objects to the Fts3MultiSegReader object passed as the
115182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 8th argument.
115183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
115184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function returns SQLITE_OK if successful, or an SQLite error code
115185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** otherwise.
115186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
115187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3SegReaderCursor(
113922 115188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *p, /* FTS3 table handle */
115189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iIndex, /* Index to search (from 0 to p->nIndex-1) */
113923 115190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iLevel, /* Level of segments to scan */
113924 115191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTerm, /* Term to query for */
113925 115192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nTerm, /* Size of zTerm in bytes */
113926 115193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isPrefix, /* True for a prefix search */
113927 115194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isScan, /* True to scan from zTerm to EOF */
113928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReaderCursor *pCsr /* Cursor object to populate */
115195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pCsr /* Cursor object to populate */
113929 115196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
113930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = SQLITE_OK;
113931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc2;
113932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iAge = 0;
113933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_stmt *pStmt = 0;
113934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReader *pPending = 0;
113935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( iLevel==FTS3_SEGCURSOR_ALL
113937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || iLevel==FTS3_SEGCURSOR_PENDING
113938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || iLevel>=0
113939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
113940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( FTS3_SEGCURSOR_PENDING<0 );
113941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( FTS3_SEGCURSOR_ALL<0 );
113942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( iLevel==FTS3_SEGCURSOR_ALL || (zTerm==0 && isPrefix==1) );
113943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( isPrefix==0 || isScan==0 );
113944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(pCsr, 0, sizeof(Fts3SegReaderCursor));
113947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If iLevel is less than 0, include a seg-reader for the pending-terms. */
113949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( isScan==0 || fts3HashCount(&p->pendingTerms)==0 );
113950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iLevel<0 && isScan==0 ){
113951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3SegReaderPending(p, zTerm, nTerm, isPrefix, &pPending);
113952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK && pPending ){
113953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nByte = (sizeof(Fts3SegReader *) * 16);
113954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->apSegment = (Fts3SegReader **)sqlite3_malloc(nByte);
113955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr->apSegment==0 ){
113956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_NOMEM;
113957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
113958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->apSegment[0] = pPending;
113959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->nSegment = 1;
113960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPending = 0;
113961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Error code */
115198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_stmt *pStmt = 0; /* Statement to iterate through segments */
115199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc2; /* Result of sqlite3_reset() */
115200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If iLevel is less than 0 and this is not a scan, include a seg-reader
115202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for the pending-terms. If this is a scan, then this call must be being
115203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** made by an fts4aux module, not an FTS table. In this case calling
115204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fts3SegReaderPending might segfault, as the data structures used by
115205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fts4aux are not completely populated. So it's easiest to filter these
115206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** calls out here. */
115207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iLevel<0 && p->aIndex ){
115208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3SegReader *pSeg = 0;
115209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3SegReaderPending(p, iIndex, zTerm, nTerm, isPrefix, &pSeg);
115210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && pSeg ){
115211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderCursorAppend(pCsr, pSeg);
113962 115212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113963 115213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113964 115214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113965 115215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iLevel!=FTS3_SEGCURSOR_PENDING ){
113966 115216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
113967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3AllSegdirs(p, iLevel, &pStmt);
115217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3AllSegdirs(p, iIndex, iLevel, &pStmt);
113968 115218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
115219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
113969 115220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( rc==SQLITE_OK && SQLITE_ROW==(rc = sqlite3_step(pStmt)) ){
115221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3SegReader *pSeg = 0;
113970 115222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113971 115223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Read the values returned by the SELECT into local variables. */
113972 115224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iStartBlock = sqlite3_column_int64(pStmt, 1);
113973 115225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iLeavesEndBlock = sqlite3_column_int64(pStmt, 2);
113974 115226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iEndBlock = sqlite3_column_int64(pStmt, 3);
113975 115227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nRoot = sqlite3_column_bytes(pStmt, 4);
113976 115228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char const *zRoot = sqlite3_column_blob(pStmt, 4);
113977 115229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If nSegment is a multiple of 16 the array needs to be extended. */
113979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (pCsr->nSegment%16)==0 ){
113980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReader **apNew;
113981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nByte = (pCsr->nSegment + 16)*sizeof(Fts3SegReader*);
113982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- apNew = (Fts3SegReader **)sqlite3_realloc(pCsr->apSegment, nByte);
113983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !apNew ){
113984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_NOMEM;
113985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto finished;
113986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->apSegment = apNew;
113988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
113989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
113990 115230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If zTerm is not NULL, and this segment is not stored entirely on its
113991 115231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** root node, the range of leaves scanned can be reduced. Do this. */
113992 115232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iStartBlock && zTerm ){
113993 115233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 *pi = (isPrefix ? &iLeavesEndBlock : 0);
113994 115234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = fts3SelectLeaf(p, zTerm, nTerm, zRoot, nRoot, &iStartBlock, pi);
113995 115235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) goto finished;
113996 115236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isPrefix==0 && isScan==0 ) iLeavesEndBlock = iStartBlock;
113997 115237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
113998 115238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
113999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3SegReaderNew(iAge, iStartBlock, iLeavesEndBlock,
114000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iEndBlock, zRoot, nRoot, &pCsr->apSegment[pCsr->nSegment]
115239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3SegReaderNew(pCsr->nSegment+1,
115240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iStartBlock, iLeavesEndBlock, iEndBlock, zRoot, nRoot, &pSeg
114001 115241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
114002 115242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) goto finished;
114003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->nSegment++;
114004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iAge++;
115243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderCursorAppend(pCsr, pSeg);
114005 115244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114006 115245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114007 115246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114008 115247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
finished:
114009 115248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc2 = sqlite3_reset(pStmt);
114010 115249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_DONE ) rc = rc2;
114011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3Fts3SegReaderFree(pPending);
114012 115250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114013 115251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
114014 115252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114015 115253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
115255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Set up a cursor object for iterating through a full-text index or a
115256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** single level therein.
115257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
115258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3SegReaderCursor(
115259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *p, /* FTS3 table handle */
115260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iIndex, /* Index to search (from 0 to p->nIndex-1) */
115261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iLevel, /* Level of segments to scan */
115262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTerm, /* Term to query for */
115263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nTerm, /* Size of zTerm in bytes */
115264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isPrefix, /* True for a prefix search */
115265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isScan, /* True to scan from zTerm to EOF */
115266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pCsr /* Cursor object to populate */
115267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
115268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iIndex>=0 && iIndex<p->nIndex );
115269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iLevel==FTS3_SEGCURSOR_ALL
115270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || iLevel==FTS3_SEGCURSOR_PENDING
115271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || iLevel>=0
115272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
115273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iLevel<FTS3_SEGDIR_MAXLEVEL );
115274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( FTS3_SEGCURSOR_ALL<0 && FTS3_SEGCURSOR_PENDING<0 );
115275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( isPrefix==0 || isScan==0 );
114016 115276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* "isScan" is only set to true by the ft4aux module, an ordinary
115278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** full-text tables. */
115279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( isScan==0 || p->aIndex==0 );
115280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(pCsr, 0, sizeof(Fts3MultiSegReader));
115282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return fts3SegReaderCursor(
115284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p, iIndex, iLevel, zTerm, nTerm, isPrefix, isScan, pCsr
115285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
115286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
115289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** In addition to its current configuration, have the Fts3MultiSegReader
115290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** passed as the 4th argument also scan the doclist for term zTerm/nTerm.
115291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
115292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code.
115293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
115294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3SegReaderCursorAddZero(
115295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *p, /* FTS virtual table handle */
115296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTerm, /* Term to scan doclist of */
115297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nTerm, /* Number of bytes in zTerm */
115298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pCsr /* Fts3MultiSegReader to modify */
115299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
115300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return fts3SegReaderCursor(p, 0, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 0, 0,pCsr);
115301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
115304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Open an Fts3MultiSegReader to scan the doclist for term zTerm/nTerm. Or,
115305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if isPrefix is true, to scan the doclist for all terms for which
115306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zTerm/nTerm is a prefix. If successful, return SQLITE_OK and write
115307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a pointer to the new Fts3MultiSegReader to *ppSegcsr. Otherwise, return
115308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** an SQLite error code.
115309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
115310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** It is the responsibility of the caller to free this object by eventually
115311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** passing it to fts3SegReaderCursorFree()
115312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
115313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code.
115314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Output parameter *ppSegcsr is set to 0 if an error occurs.
115315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
114017 115316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3TermSegReaderCursor(
114018 115317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Cursor *pCsr, /* Virtual table cursor handle */
114019 115318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTerm, /* Term to query for */
114020 115319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nTerm, /* Size of zTerm in bytes */
114021 115320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isPrefix, /* True for a prefix search */
114022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReaderCursor **ppSegcsr /* OUT: Allocated seg-reader cursor */
115321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader **ppSegcsr /* OUT: Allocated seg-reader cursor */
114023 115322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
114024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReaderCursor *pSegcsr; /* Object to allocate and return */
115323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pSegcsr; /* Object to allocate and return */
114025 115324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_NOMEM; /* Return code */
114026 115325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSegcsr = sqlite3_malloc(sizeof(Fts3SegReaderCursor));
115326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSegcsr = sqlite3_malloc(sizeof(Fts3MultiSegReader));
114028 115327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pSegcsr ){
115328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
115329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bFound = 0; /* True once an index has been found */
114029 115330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *p = (Fts3Table *)pCsr->base.pVtab;
114030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i;
114031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nCost = 0;
114032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3SegReaderCursor(
114033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p, FTS3_SEGCURSOR_ALL, zTerm, nTerm, isPrefix, 0, pSegcsr);
114034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; rc==SQLITE_OK && i<pSegcsr->nSegment; i++){
114036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3SegReaderCost(pCsr, pSegcsr->apSegment[i], &nCost);
114037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSegcsr->nCost = nCost;
115331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( isPrefix ){
115333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=1; bFound==0 && i<p->nIndex; i++){
115334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->aIndex[i].nPrefix==nTerm ){
115335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bFound = 1;
115336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3SegReaderCursor(
115337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p, i, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 0, 0, pSegcsr);
115338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSegcsr->bLookup = 1;
115339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=1; bFound==0 && i<p->nIndex; i++){
115343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->aIndex[i].nPrefix==nTerm+1 ){
115344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bFound = 1;
115345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3SegReaderCursor(
115346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p, i, FTS3_SEGCURSOR_ALL, zTerm, nTerm, 1, 0, pSegcsr
115347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
115348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
115349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderCursorAddZero(p, zTerm, nTerm, pSegcsr);
115350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bFound==0 ){
115356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3SegReaderCursor(
115357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p, 0, FTS3_SEGCURSOR_ALL, zTerm, nTerm, isPrefix, 0, pSegcsr
115358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
115359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSegcsr->bLookup = !isPrefix;
115360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
114039 115361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114040 115362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114041 115363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*ppSegcsr = pSegcsr;
114042 115364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
114043 115365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114044 115366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void fts3SegReaderCursorFree(Fts3SegReaderCursor *pSegcsr){
115367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
115368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Free an Fts3MultiSegReader allocated by fts3TermSegReaderCursor().
115369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
115370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3SegReaderCursorFree(Fts3MultiSegReader *pSegcsr){
114046 115371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3SegReaderFinish(pSegcsr);
114047 115372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pSegcsr);
114048 115373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114049 115374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114050 115375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
114051 115376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function retreives the doclist for the specified term (or term
114052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** prefix) from the database.
114053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
114054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The returned doclist may be in one of two formats, depending on the
114055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** value of parameter isReqPos. If isReqPos is zero, then the doclist is
114056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** a sorted list of delta-compressed docids (a bare doclist). If isReqPos
114057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is non-zero, then the returned list is in the same format as is stored
114058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** in the database without the found length specifier at the start of on-disk
114059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** doclists.
115377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** prefix) from the database.
114060 115378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
114061 115379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3TermSelect(
114062 115380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *p, /* Virtual table handle */
114063 115381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3PhraseToken *pTok, /* Token to query for */
114064 115382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iColumn, /* Column to query (or -ve for all columns) */
114065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int isReqPos, /* True to include position lists in output */
114066 115383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int *pnOut, /* OUT: Size of buffer at *ppOut */
114067 115384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char **ppOut /* OUT: Malloced result buffer */
114068 115385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
114069 115386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc; /* Return code */
114070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReaderCursor *pSegcsr; /* Seg-reader cursor for this term */
114071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- TermSelect tsc; /* Context object for fts3TermSelectCb() */
115387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pSegcsr; /* Seg-reader cursor for this term */
115388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ TermSelect tsc; /* Object for pair-wise doclist merging */
114072 115389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3SegFilter filter; /* Segment term filter configuration */
114073 115390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114074 115391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pSegcsr = pTok->pSegcsr;
114075 115392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&tsc, 0, sizeof(TermSelect));
114076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- tsc.isReqPos = isReqPos;
114077 115393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- filter.flags = FTS3_SEGMENT_IGNORE_EMPTY
115394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ filter.flags = FTS3_SEGMENT_IGNORE_EMPTY | FTS3_SEGMENT_REQUIRE_POS
114079 115395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
| (pTok->isPrefix ? FTS3_SEGMENT_PREFIX : 0)
114080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- | (isReqPos ? FTS3_SEGMENT_REQUIRE_POS : 0)
114081 115396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
| (iColumn<p->nColumn ? FTS3_SEGMENT_COLUMN_FILTER : 0);
114082 115397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
filter.iCol = iColumn;
114083 115398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
filter.zTerm = pTok->z;
114084 115399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
filter.nTerm = pTok->n;
114085 115400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114086 115401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3Fts3SegReaderStart(p, pSegcsr, &filter);
114087 115402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( SQLITE_OK==rc
114088 115403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& SQLITE_ROW==(rc = sqlite3Fts3SegReaderStep(p, pSegcsr))
114089 115404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
114090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3TermSelectCb(p, (void *)&tsc,
114091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pSegcsr->zTerm, pSegcsr->nTerm, pSegcsr->aDoclist, pSegcsr->nDoclist
114092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
115405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3TermSelectMerge(p, &tsc, pSegcsr->aDoclist, pSegcsr->nDoclist);
114093 115406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114094 115407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114095 115408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
114096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3TermSelectMerge(&tsc);
115409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3TermSelectFinishMerge(p, &tsc);
114097 115410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114098 115411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
114099 115412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*ppOut = tsc.aaOutput[0];
114100 115413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pnOut = tsc.anOutput[0];
114101 115414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
@@ -114117,686 +115430,23 @@
114117 115430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the isPoslist argument is true, then it is assumed that the doclist
114118 115431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** contains a position-list following each docid. Otherwise, it is assumed
114119 115432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** that the doclist is simply a list of docids stored as delta encoded
114120 115433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** varints.
114121 115434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
114122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3DoclistCountDocids(int isPoslist, char *aList, int nList){
115435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3DoclistCountDocids(char *aList, int nList){
114123 115436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nDoc = 0; /* Return value */
114124 115437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( aList ){
114125 115438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aEnd = &aList[nList]; /* Pointer to one byte after EOF */
114126 115439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *p = aList; /* Cursor */
114127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !isPoslist ){
114128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* The number of docids in the list is the same as the number of
114129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** varints. In FTS3 a varint consists of a single byte with the 0x80
114130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** bit cleared and zero or more bytes with the 0x80 bit set. So to
114131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** count the varints in the buffer, just count the number of bytes
114132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** with the 0x80 bit clear. */
114133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( p<aEnd ) nDoc += (((*p++)&0x80)==0);
114134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( p<aEnd ){
114136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nDoc++;
114137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( (*p++)&0x80 ); /* Skip docid varint */
114138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PoslistCopy(0, &p); /* Skip over position list */
114139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return nDoc;
114144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
114147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Call sqlite3Fts3DeferToken() for each token in the expression pExpr.
114148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3DeferExpression(Fts3Cursor *pCsr, Fts3Expr *pExpr){
114150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = SQLITE_OK;
114151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr ){
114152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3DeferExpression(pCsr, pExpr->pLeft);
114153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
114154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3DeferExpression(pCsr, pExpr->pRight);
114155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->eType==FTSQUERY_PHRASE ){
114157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iCol = pExpr->pPhrase->iColumn;
114158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int i;
114159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; rc==SQLITE_OK && i<pExpr->pPhrase->nToken; i++){
114160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3PhraseToken *pToken = &pExpr->pPhrase->aToken[i];
114161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pToken->pDeferred==0 ){
114162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3DeferToken(pCsr, pToken, iCol);
114163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
114168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
114171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This function removes the position information from a doclist. When
114172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** called, buffer aList (size *pnList bytes) contains a doclist that includes
114173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** position information. This function removes the position information so
114174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** that aList contains only docids, and adjusts *pnList to reflect the new
114175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** (possibly reduced) size of the doclist.
114176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void fts3DoclistStripPositions(
114178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aList, /* IN/OUT: Buffer containing doclist */
114179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pnList /* IN/OUT: Size of doclist in bytes */
114180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
114181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aList ){
114182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aEnd = &aList[*pnList]; /* Pointer to one byte after EOF */
114183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *p = aList; /* Input cursor */
114184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pOut = aList; /* Output cursor */
114185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( p<aEnd ){
114187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 delta;
114188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p += sqlite3Fts3GetVarint(p, &delta);
114189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PoslistCopy(0, &p);
114190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOut += sqlite3Fts3PutVarint(pOut, delta);
114191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnList = (int)(pOut - aList);
114194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
114198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Return a DocList corresponding to the phrase *pPhrase.
114199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
114200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If this function returns SQLITE_OK, but *pnOut is set to a negative value,
114201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** then no tokens in the phrase were looked up in the full-text index. This
114202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is only possible when this function is called from within xFilter(). The
114203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** caller should assume that all documents match the phrase. The actual
114204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** filtering will take place in xNext().
114205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3PhraseSelect(
114207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Cursor *pCsr, /* Virtual table cursor handle */
114208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Phrase *pPhrase, /* Phrase to return a doclist for */
114209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int isReqPos, /* True if output should contain positions */
114210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char **paOut, /* OUT: Pointer to malloc'd result buffer */
114211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pnOut /* OUT: Size of buffer at *paOut */
114212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
114213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pOut = 0;
114214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nOut = 0;
114215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = SQLITE_OK;
114216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int ii;
114217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iCol = pPhrase->iColumn;
114218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int isTermPos = (pPhrase->nToken>1 || isReqPos);
114219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Table *p = (Fts3Table *)pCsr->base.pVtab;
114220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int isFirst = 1;
114221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iPrevTok = 0;
114223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nDoc = 0;
114224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If this is an xFilter() evaluation, create a segment-reader for each
114226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** phrase token. Or, if this is an xNext() or snippet/offsets/matchinfo
114227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** evaluation, only create segment-readers if there are no Fts3DeferredToken
114228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** objects attached to the phrase-tokens.
114229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(ii=0; ii<pPhrase->nToken; ii++){
114231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3PhraseToken *pTok = &pPhrase->aToken[ii];
114232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pTok->pSegcsr==0 ){
114233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (pCsr->eEvalmode==FTS3_EVAL_FILTER)
114234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || (pCsr->eEvalmode==FTS3_EVAL_NEXT && pCsr->pDeferred==0)
114235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || (pCsr->eEvalmode==FTS3_EVAL_MATCHINFO && pTok->bFulltext)
114236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
114237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3TermSegReaderCursor(
114238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr, pTok->z, pTok->n, pTok->isPrefix, &pTok->pSegcsr
114239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) return rc;
114241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(ii=0; ii<pPhrase->nToken; ii++){
114246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3PhraseToken *pTok; /* Token to find doclist for */
114247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iTok = 0; /* The token being queried this iteration */
114248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pList = 0; /* Pointer to token doclist */
114249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nList = 0; /* Size of buffer at pList */
114250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Select a token to process. If this is an xFilter() call, then tokens
114252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** are processed in order from least to most costly. Otherwise, tokens
114253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** are processed in the order in which they occur in the phrase.
114254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr->eEvalmode==FTS3_EVAL_MATCHINFO ){
114256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( isReqPos );
114257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iTok = ii;
114258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTok = &pPhrase->aToken[iTok];
114259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pTok->bFulltext==0 ) continue;
114260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( pCsr->eEvalmode==FTS3_EVAL_NEXT || isReqPos ){
114261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iTok = ii;
114262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTok = &pPhrase->aToken[iTok];
114263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nMinCost = 0x7FFFFFFF;
114265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int jj;
114266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Find the remaining token with the lowest cost. */
114268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(jj=0; jj<pPhrase->nToken; jj++){
114269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReaderCursor *pSegcsr = pPhrase->aToken[jj].pSegcsr;
114270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pSegcsr && pSegcsr->nCost<nMinCost ){
114271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iTok = jj;
114272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nMinCost = pSegcsr->nCost;
114273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTok = &pPhrase->aToken[iTok];
114276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* This branch is taken if it is determined that loading the doclist
114278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** for the next token would require more IO than loading all documents
114279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** currently identified by doclist pOut/nOut. No further doclists will
114280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** be loaded from the full-text index for this phrase.
114281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nMinCost>nDoc && ii>0 ){
114283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3DeferExpression(pCsr, pCsr->pExpr);
114284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
114285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr->eEvalmode==FTS3_EVAL_NEXT && pTok->pDeferred ){
114289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3DeferredTermSelect(pTok->pDeferred, isTermPos, &nList, &pList);
114290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pTok->pSegcsr ){
114292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3TermSelect(p, pTok, iCol, isTermPos, &nList, &pList);
114293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pTok->bFulltext = 1;
114295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( rc!=SQLITE_OK || pCsr->eEvalmode || pTok->pSegcsr==0 );
114297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) break;
114298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( isFirst ){
114300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOut = pList;
114301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nOut = nList;
114302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr->eEvalmode==FTS3_EVAL_FILTER && pPhrase->nToken>1 ){
114303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nDoc = fts3DoclistCountDocids(1, pOut, nOut);
114304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- isFirst = 0;
114306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iPrevTok = iTok;
114307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Merge the new term list and the current output. */
114309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aLeft, *aRight;
114310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nLeft, nRight;
114311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nDist;
114312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int mt;
114313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If this is the final token of the phrase, and positions were not
114315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** requested by the caller, use MERGE_PHRASE instead of POS_PHRASE.
114316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This drops the position information from the output list.
114317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mt = MERGE_POS_PHRASE;
114319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ii==pPhrase->nToken-1 && !isReqPos ) mt = MERGE_PHRASE;
114320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( iPrevTok!=iTok );
114322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iPrevTok<iTok ){
114323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aLeft = pOut;
114324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nLeft = nOut;
114325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aRight = pList;
114326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nRight = nList;
114327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nDist = iTok-iPrevTok;
114328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iPrevTok = iTok;
114329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aRight = pOut;
114331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nRight = nOut;
114332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aLeft = pList;
114333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nLeft = nList;
114334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nDist = iPrevTok-iTok;
114335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pOut = aRight;
114337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3DoclistMerge(
114338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mt, nDist, 0, pOut, &nOut, aLeft, nLeft, aRight, nRight, &nDoc
114339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(aLeft);
114341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( nOut==0 || pOut!=0 );
114343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
114346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ii!=pPhrase->nToken ){
114347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pCsr->eEvalmode==FTS3_EVAL_FILTER && isReqPos==0 );
114348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3DoclistStripPositions(pOut, &nOut);
114349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *paOut = pOut;
114351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnOut = nOut;
114352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(pOut);
114354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
114356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
114359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This function merges two doclists according to the requirements of a
114360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** NEAR operator.
114361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
114362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Both input doclists must include position information. The output doclist
114363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** includes position information if the first argument to this function
114364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is MERGE_POS_NEAR, or does not if it is MERGE_NEAR.
114365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3NearMerge(
114367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int mergetype, /* MERGE_POS_NEAR or MERGE_NEAR */
114368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nNear, /* Parameter to NEAR operator */
114369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nTokenLeft, /* Number of tokens in LHS phrase arg */
114370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aLeft, /* Doclist for LHS (incl. positions) */
114371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nLeft, /* Size of LHS doclist in bytes */
114372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nTokenRight, /* As nTokenLeft */
114373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aRight, /* As aLeft */
114374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nRight, /* As nRight */
114375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char **paOut, /* OUT: Results of merge (malloced) */
114376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pnOut /* OUT: Sized of output buffer */
114377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
114378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aOut; /* Buffer to write output doclist to */
114379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc; /* Return code */
114380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( mergetype==MERGE_POS_NEAR || MERGE_NEAR );
114382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aOut = sqlite3_malloc(nLeft+nRight+1);
114384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aOut==0 ){
114385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_NOMEM;
114386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3DoclistMerge(mergetype, nNear+nTokenRight, nNear+nTokenLeft,
114388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aOut, pnOut, aLeft, nLeft, aRight, nRight, 0
114389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ){
114391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(aOut);
114392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aOut = 0;
114393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *paOut = aOut;
114397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
114398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
114401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This function is used as part of the processing for the snippet() and
114402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** offsets() functions.
114403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
114404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Both pLeft and pRight are expression nodes of type FTSQUERY_PHRASE. Both
114405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** have their respective doclists (including position information) loaded
114406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** in Fts3Expr.aDoclist/nDoclist. This function removes all entries from
114407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** each doclist that are not within nNear tokens of a corresponding entry
114408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** in the other doclist.
114409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3ExprNearTrim(Fts3Expr *pLeft, Fts3Expr *pRight, int nNear){
114411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc; /* Return code */
114412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLeft->eType==FTSQUERY_PHRASE );
114414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pRight->eType==FTSQUERY_PHRASE );
114415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLeft->isLoaded && pRight->isLoaded );
114416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pLeft->aDoclist==0 || pRight->aDoclist==0 ){
114418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(pLeft->aDoclist);
114419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(pRight->aDoclist);
114420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pRight->aDoclist = 0;
114421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLeft->aDoclist = 0;
114422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_OK;
114423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aOut; /* Buffer in which to assemble new doclist */
114425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nOut; /* Size of buffer aOut in bytes */
114426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3NearMerge(MERGE_POS_NEAR, nNear,
114428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLeft->pPhrase->nToken, pLeft->aDoclist, pLeft->nDoclist,
114429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pRight->pPhrase->nToken, pRight->aDoclist, pRight->nDoclist,
114430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- &aOut, &nOut
114431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) return rc;
114433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(pRight->aDoclist);
114434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pRight->aDoclist = aOut;
114435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pRight->nDoclist = nOut;
114436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3NearMerge(MERGE_POS_NEAR, nNear,
114438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pRight->pPhrase->nToken, pRight->aDoclist, pRight->nDoclist,
114439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLeft->pPhrase->nToken, pLeft->aDoclist, pLeft->nDoclist,
114440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- &aOut, &nOut
114441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(pLeft->aDoclist);
114443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLeft->aDoclist = aOut;
114444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLeft->nDoclist = nOut;
114445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
114447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
114451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Allocate an Fts3SegReaderArray for each token in the expression pExpr.
114452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The allocated objects are stored in the Fts3PhraseToken.pArray member
114453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** variables of each token structure.
114454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3ExprAllocateSegReaders(
114456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Cursor *pCsr, /* FTS3 table */
114457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Expr *pExpr, /* Expression to create seg-readers for */
114458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pnExpr /* OUT: Number of AND'd expressions */
114459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
114460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = SQLITE_OK; /* Return code */
114461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pCsr->eEvalmode==FTS3_EVAL_FILTER );
114463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pnExpr && pExpr->eType!=FTSQUERY_AND ){
114464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (*pnExpr)++;
114465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pnExpr = 0;
114466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->eType==FTSQUERY_PHRASE ){
114469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Phrase *pPhrase = pExpr->pPhrase;
114470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int ii;
114471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(ii=0; rc==SQLITE_OK && ii<pPhrase->nToken; ii++){
114473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3PhraseToken *pTok = &pPhrase->aToken[ii];
114474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pTok->pSegcsr==0 ){
114475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3TermSegReaderCursor(
114476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr, pTok->z, pTok->n, pTok->isPrefix, &pTok->pSegcsr
114477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3ExprAllocateSegReaders(pCsr, pExpr->pLeft, pnExpr);
114482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
114483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3ExprAllocateSegReaders(pCsr, pExpr->pRight, pnExpr);
114484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
114487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
114490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Free the Fts3SegReaderArray objects associated with each token in the
114491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** expression pExpr. In other words, this function frees the resources
114492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** allocated by fts3ExprAllocateSegReaders().
114493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void fts3ExprFreeSegReaders(Fts3Expr *pExpr){
114495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr ){
114496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Phrase *pPhrase = pExpr->pPhrase;
114497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pPhrase ){
114498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int kk;
114499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(kk=0; kk<pPhrase->nToken; kk++){
114500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3SegReaderCursorFree(pPhrase->aToken[kk].pSegcsr);
114501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pPhrase->aToken[kk].pSegcsr = 0;
114502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3ExprFreeSegReaders(pExpr->pLeft);
114505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3ExprFreeSegReaders(pExpr->pRight);
114506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
114510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Return the sum of the costs of all tokens in the expression pExpr. This
114511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** function must be called after Fts3SegReaderArrays have been allocated
114512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** for all tokens using fts3ExprAllocateSegReaders().
114513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3ExprCost(Fts3Expr *pExpr){
114515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nCost; /* Return value */
114516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->eType==FTSQUERY_PHRASE ){
114517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Phrase *pPhrase = pExpr->pPhrase;
114518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int ii;
114519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nCost = 0;
114520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(ii=0; ii<pPhrase->nToken; ii++){
114521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReaderCursor *pSegcsr = pPhrase->aToken[ii].pSegcsr;
114522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pSegcsr ) nCost += pSegcsr->nCost;
114523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nCost = fts3ExprCost(pExpr->pLeft) + fts3ExprCost(pExpr->pRight);
114526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return nCost;
114528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
114531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The following is a helper function (and type) for fts3EvalExpr(). It
114532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** must be called after Fts3SegReaders have been allocated for every token
114533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** in the expression. See the context it is called from in fts3EvalExpr()
114534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** for further explanation.
114535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- typedef struct ExprAndCost ExprAndCost;
114537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- struct ExprAndCost {
114538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Expr *pExpr;
114539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nCost;
114540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
114541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void fts3ExprAssignCosts(
114542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Expr *pExpr, /* Expression to create seg-readers for */
114543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ExprAndCost **ppExprCost /* OUT: Write to *ppExprCost */
114544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
114545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->eType==FTSQUERY_AND ){
114546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3ExprAssignCosts(pExpr->pLeft, ppExprCost);
114547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3ExprAssignCosts(pExpr->pRight, ppExprCost);
114548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (*ppExprCost)->pExpr = pExpr;
114550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (*ppExprCost)->nCost = fts3ExprCost(pExpr);
114551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- (*ppExprCost)++;
114552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
114556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Evaluate the full-text expression pExpr against FTS3 table pTab. Store
114557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the resulting doclist in *paOut and *pnOut. This routine mallocs for
114558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the space needed to store the output. The caller is responsible for
114559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** freeing the space when it has finished.
114560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
114561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This function is called in two distinct contexts:
114562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
114563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** * From within the virtual table xFilter() method. In this case, the
114564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** output doclist contains entries for all rows in the table, based on
114565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** data read from the full-text index.
114566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
114567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** In this case, if the query expression contains one or more tokens that
114568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** are very common, then the returned doclist may contain a superset of
114569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the documents that actually match the expression.
114570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
114571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** * From within the virtual table xNext() method. This call is only made
114572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** if the call from within xFilter() found that there were very common
114573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** tokens in the query expression and did return a superset of the
114574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** matching documents. In this case the returned doclist contains only
114575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** entries that correspond to the current row of the table. Instead of
114576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** reading the data for each token from the full-text index, the data is
114577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** already available in-memory in the Fts3PhraseToken.pDeferred structures.
114578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** See fts3EvalDeferred() for how it gets there.
114579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
114580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** In the first case above, Fts3Cursor.doDeferred==0. In the second (if it is
114581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** required) Fts3Cursor.doDeferred==1.
114582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
114583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If the SQLite invokes the snippet(), offsets() or matchinfo() function
114584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** as part of a SELECT on an FTS3 table, this function is called on each
114585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** individual phrase expression in the query. If there were very common tokens
114586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** found in the xFilter() call, then this function is called once for phrase
114587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** for each row visited, and the returned doclist contains entries for the
114588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** current row only. Otherwise, if there were no very common tokens, then this
114589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** function is called once only for each phrase in the query and the returned
114590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** doclist contains entries for all rows of the table.
114591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
114592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Fts3Cursor.doDeferred==1 when this function is called on phrases as a
114593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** result of a snippet(), offsets() or matchinfo() invocation.
114594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3EvalExpr(
114596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Cursor *p, /* Virtual table cursor handle */
114597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Expr *pExpr, /* Parsed fts3 expression */
114598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char **paOut, /* OUT: Pointer to malloc'd result buffer */
114599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pnOut, /* OUT: Size of buffer at *paOut */
114600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int isReqPos /* Require positions in output buffer */
114601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
114602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = SQLITE_OK; /* Return code */
114603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Zero the output parameters. */
114605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *paOut = 0;
114606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnOut = 0;
114607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr ){
114609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pExpr->eType==FTSQUERY_NEAR || pExpr->eType==FTSQUERY_OR
114610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || pExpr->eType==FTSQUERY_AND || pExpr->eType==FTSQUERY_NOT
114611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || pExpr->eType==FTSQUERY_PHRASE
114612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pExpr->eType==FTSQUERY_PHRASE || isReqPos==0 );
114614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->eType==FTSQUERY_PHRASE ){
114616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3PhraseSelect(p, pExpr->pPhrase,
114617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- isReqPos || (pExpr->pParent && pExpr->pParent->eType==FTSQUERY_NEAR),
114618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- paOut, pnOut
114619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3ExprFreeSegReaders(pExpr);
114621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( p->eEvalmode==FTS3_EVAL_FILTER && pExpr->eType==FTSQUERY_AND ){
114622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ExprAndCost *aExpr = 0; /* Array of AND'd expressions and costs */
114623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nExpr = 0; /* Size of aExpr[] */
114624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aRet = 0; /* Doclist to return to caller */
114625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nRet = 0; /* Length of aRet[] in bytes */
114626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nDoc = 0x7FFFFFFF;
114627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( !isReqPos );
114629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3ExprAllocateSegReaders(p, pExpr, &nExpr);
114631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
114632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( nExpr>1 );
114633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aExpr = sqlite3_malloc(sizeof(ExprAndCost) * nExpr);
114634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !aExpr ) rc = SQLITE_NOMEM;
114635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
114637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int ii; /* Used to iterate through expressions */
114638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3ExprAssignCosts(pExpr, &aExpr);
114640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aExpr -= nExpr;
114641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(ii=0; ii<nExpr; ii++){
114642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aNew;
114643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nNew;
114644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int jj;
114645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ExprAndCost *pBest = 0;
114646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(jj=0; jj<nExpr; jj++){
114648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ExprAndCost *pCand = &aExpr[jj];
114649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCand->pExpr && (pBest==0 || pCand->nCost<pBest->nCost) ){
114650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pBest = pCand;
114651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pBest->nCost>nDoc ){
114655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3DeferExpression(p, p->pExpr);
114656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
114657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3EvalExpr(p, pBest->pExpr, &aNew, &nNew, 0);
114659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) break;
114660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pBest->pExpr = 0;
114661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ii==0 ){
114662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aRet = aNew;
114663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nRet = nNew;
114664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nDoc = fts3DoclistCountDocids(0, aRet, nRet);
114665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3DoclistMerge(
114667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- MERGE_AND, 0, 0, aRet, &nRet, aRet, nRet, aNew, nNew, &nDoc
114668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(aNew);
114670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
114676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *paOut = aRet;
114677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnOut = nRet;
114678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( *paOut==0 );
114680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(aRet);
114681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(aExpr);
114683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3ExprFreeSegReaders(pExpr);
114684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aLeft;
114687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aRight;
114688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nLeft;
114689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nRight;
114690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pExpr->eType==FTSQUERY_NEAR
114692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || pExpr->eType==FTSQUERY_OR
114693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || pExpr->eType==FTSQUERY_NOT
114694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || (pExpr->eType==FTSQUERY_AND && p->eEvalmode==FTS3_EVAL_NEXT)
114695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( 0==(rc = fts3EvalExpr(p, pExpr->pRight, &aRight, &nRight, isReqPos))
114698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && 0==(rc = fts3EvalExpr(p, pExpr->pLeft, &aLeft, &nLeft, isReqPos))
114699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
114700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- switch( pExpr->eType ){
114701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case FTSQUERY_NEAR: {
114702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Expr *pLeft;
114703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Expr *pRight;
114704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int mergetype = MERGE_NEAR;
114705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->pParent && pExpr->pParent->eType==FTSQUERY_NEAR ){
114706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- mergetype = MERGE_POS_NEAR;
114707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLeft = pExpr->pLeft;
114709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( pLeft->eType==FTSQUERY_NEAR ){
114710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLeft=pLeft->pRight;
114711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pRight = pExpr->pRight;
114713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pRight->eType==FTSQUERY_PHRASE );
114714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLeft->eType==FTSQUERY_PHRASE );
114715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3NearMerge(mergetype, pExpr->nNear,
114717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLeft->pPhrase->nToken, aLeft, nLeft,
114718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pRight->pPhrase->nToken, aRight, nRight,
114719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- paOut, pnOut
114720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(aLeft);
114722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
114723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- case FTSQUERY_OR: {
114726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Allocate a buffer for the output. The maximum size is the
114727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** sum of the sizes of the two input buffers. The +1 term is
114728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** so that a buffer of zero bytes is never allocated - this can
114729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** cause fts3DoclistMerge() to incorrectly return SQLITE_NOMEM.
114730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *aBuffer = sqlite3_malloc(nRight+nLeft+1);
114732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3DoclistMerge(MERGE_OR, 0, 0, aBuffer, pnOut,
114733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aLeft, nLeft, aRight, nRight, 0
114734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *paOut = aBuffer;
114736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(aLeft);
114737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
114738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- default: {
114741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( FTSQUERY_NOT==MERGE_NOT && FTSQUERY_AND==MERGE_AND );
114742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3DoclistMerge(pExpr->eType, 0, 0, aLeft, pnOut,
114743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aLeft, nLeft, aRight, nRight, 0
114744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *paOut = aLeft;
114746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
114747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(aRight);
114751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( rc==SQLITE_OK || *paOut==0 );
114755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
114756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
114759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This function is called from within xNext() for each row visited by
114760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** an FTS3 query. If evaluating the FTS3 query expression within xFilter()
114761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** was able to determine the exact set of matching rows, this function sets
114762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** *pbRes to true and returns SQLITE_IO immediately.
114763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
114764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Otherwise, if evaluating the query expression within xFilter() returned a
114765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** superset of the matching documents instead of an exact set (this happens
114766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** when the query includes very common tokens and it is deemed too expensive to
114767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** load their doclists from disk), this function tests if the current row
114768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** really does match the FTS3 query.
114769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
114770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If an error occurs, an SQLite error code is returned. Otherwise, SQLITE_OK
114771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is returned and *pbRes is set to true if the current row matches the
114772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** FTS3 query (and should be included in the results returned to SQLite), or
114773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** false otherwise.
114774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3EvalDeferred(
114776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Cursor *pCsr, /* FTS3 cursor pointing at row to test */
114777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pbRes /* OUT: Set to true if row is a match */
114778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
114779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = SQLITE_OK;
114780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr->pDeferred==0 ){
114781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pbRes = 1;
114782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3CursorSeek(0, pCsr);
114784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
114785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3Fts3FreeDeferredDoclists(pCsr);
114786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3CacheDeferredDoclists(pCsr);
114787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
114789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *a = 0;
114790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n = 0;
114791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3EvalExpr(pCsr, pCsr->pExpr, &a, &n, 0);
114792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( n>=0 );
114793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pbRes = (n>0);
114794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(a);
114795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
115440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( p<aEnd ){
115441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nDoc++;
115442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( (*p++)&0x80 ); /* Skip docid varint */
115443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistCopy(0, &p); /* Skip over position list */
115444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return nDoc;
114798 115448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114799 115449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114800 115450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
114801 115451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Advance the cursor to the next row in the %_content table that
114802 115452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** matches the search criteria. For a MATCH search, this will be
@@ -114807,43 +115457,24 @@
114807 115457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return SQLITE_OK if nothing goes wrong. SQLITE_OK is returned
114808 115458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** even if we reach end-of-file. The fts3EofMethod() will be called
114809 115459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** subsequently to determine whether or not an EOF was hit.
114810 115460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
114811 115461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3NextMethod(sqlite3_vtab_cursor *pCursor){
114812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int res;
114813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = SQLITE_OK; /* Return code */
115462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
114814 115463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Cursor *pCsr = (Fts3Cursor *)pCursor;
114815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->eEvalmode = FTS3_EVAL_NEXT;
114817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- do {
114818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr->aDoclist==0 ){
114819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( SQLITE_ROW!=sqlite3_step(pCsr->pStmt) ){
114820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->isEof = 1;
114821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3_reset(pCsr->pStmt);
114822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
114823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pCsr->eSearch==FTS3_DOCID_SEARCH || pCsr->eSearch==FTS3_FULLSCAN_SEARCH ){
115465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( SQLITE_ROW!=sqlite3_step(pCsr->pStmt) ){
115466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->isEof = 1;
115467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3_reset(pCsr->pStmt);
115468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
114824 115469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->iPrevId = sqlite3_column_int64(pCsr->pStmt, 0);
114825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr->desc==0 ){
114827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr->pNextId>=&pCsr->aDoclist[pCsr->nDoclist] ){
114828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->isEof = 1;
114829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
114830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint(&pCsr->pNextId, &pCsr->iPrevId);
114832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetReverseDeltaVarint(&pCsr->pNextId,pCsr->aDoclist,&pCsr->iPrevId);
114834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr->pNextId<=pCsr->aDoclist ){
114835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->isEof = 1;
114836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- break;
114837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_reset(pCsr->pStmt);
114840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->isRequireSeek = 1;
114841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->isMatchinfoNeeded = 1;
114842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }while( SQLITE_OK==(rc = fts3EvalDeferred(pCsr, &res)) && res==0 );
114844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
115470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_OK;
115471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
115473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3EvalNext((Fts3Cursor *)pCursor);
115474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 );
114845 115476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
114846 115477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114847 115478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114848 115479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
114849 115480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This is the xFilter interface for the virtual table. See
@@ -114866,15 +115497,11 @@
114866 115497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int idxNum, /* Strategy index */
114867 115498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *idxStr, /* Unused */
114868 115499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nVal, /* Number of elements in apVal */
114869 115500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_value **apVal /* Arguments for the indexing scheme */
114870 115501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
114871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *azSql[] = {
114872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "SELECT %s FROM %Q.'%q_content' AS x WHERE docid = ?", /* non-full-scan */
114873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "SELECT %s FROM %Q.'%q_content' AS x ORDER BY docid %s", /* full-scan */
114874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- };
114875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc; /* Return code */
115502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
114876 115503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zSql; /* SQL statement used to access %_content */
114877 115504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *p = (Fts3Table *)pCursor->pVtab;
114878 115505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Cursor *pCsr = (Fts3Cursor *)pCursor;
114879 115506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114880 115507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(idxStr);
@@ -114889,10 +115516,17 @@
114889 115516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_finalize(pCsr->pStmt);
114890 115517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pCsr->aDoclist);
114891 115518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3ExprFree(pCsr->pExpr);
114892 115519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&pCursor[1], 0, sizeof(Fts3Cursor)-sizeof(sqlite3_vtab_cursor));
114893 115520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( idxStr ){
115522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->bDesc = (idxStr[0]=='D');
115523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
115524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->bDesc = p->bDescIdx;
115525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->eSearch = (i16)idxNum;
115527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114894 115528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( idxNum!=FTS3_DOCID_SEARCH && idxNum!=FTS3_FULLSCAN_SEARCH ){
114895 115529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iCol = idxNum-FTS3_FULLTEXT_SEARCH;
114896 115530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zQuery = (const char *)sqlite3_value_text(apVal[0]);
114897 115531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114898 115532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( zQuery==0 && sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
@@ -114902,20 +115536,21 @@
114902 115536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3Fts3ExprParse(p->pTokenizer, p->azColumn, p->nColumn,
114903 115537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iCol, zQuery, -1, &pCsr->pExpr
114904 115538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
114905 115539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
114906 115540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_ERROR ){
114907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->base.zErrMsg = sqlite3_mprintf("malformed MATCH expression: [%s]",
114908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zQuery);
115541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static const char *zErr = "malformed MATCH expression: [%s]";
115542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->base.zErrMsg = sqlite3_mprintf(zErr, zQuery);
114909 115543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114910 115544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
114911 115545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114912 115546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114913 115547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3Fts3ReadLock(p);
114914 115548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) return rc;
114915 115549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3EvalExpr(pCsr, pCsr->pExpr, &pCsr->aDoclist, &pCsr->nDoclist, 0);
115550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3EvalStart(pCsr);
115551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114917 115552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3SegmentsClose(p);
114918 115553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) return rc;
114919 115554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->pNextId = pCsr->aDoclist;
114920 115555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->iPrevId = 0;
114921 115556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -114923,41 +115558,28 @@
114923 115558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Compile a SELECT statement for this cursor. For a full-table-scan, the
114924 115559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** statement loops through all rows of the %_content table. For a
114925 115560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** full-text query or docid lookup, the statement retrieves a single
114926 115561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** row by docid.
114927 115562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
114928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zSql = (char *)azSql[idxNum==FTS3_FULLSCAN_SEARCH];
114929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zSql = sqlite3_mprintf(
114930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zSql, p->zReadExprlist, p->zDb, p->zName, (idxStr ? idxStr : "ASC")
114931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
114932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !zSql ){
114933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_NOMEM;
115563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( idxNum==FTS3_FULLSCAN_SEARCH ){
115564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zSort = (pCsr->bDesc ? "DESC" : "ASC");
115565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTmpl = "SELECT %s FROM %Q.'%q_content' AS x ORDER BY docid %s";
115566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zSql = sqlite3_mprintf(zTmpl, p->zReadExprlist, p->zDb, p->zName, zSort);
114934 115567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
114935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3_prepare_v2(p->db, zSql, -1, &pCsr->pStmt, 0);
114936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(zSql);
115568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTmpl = "SELECT %s FROM %Q.'%q_content' AS x WHERE docid = ?";
115569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zSql = sqlite3_mprintf(zTmpl, p->zReadExprlist, p->zDb, p->zName);
114937 115570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK && idxNum==FTS3_DOCID_SEARCH ){
115571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !zSql ) return SQLITE_NOMEM;
115572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3_prepare_v2(p->db, zSql, -1, &pCsr->pStmt, 0);
115573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(zSql);
115574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) return rc;
115575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( idxNum==FTS3_DOCID_SEARCH ){
114939 115577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3_bind_value(pCsr->pStmt, 1, apVal[0]);
114940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->eSearch = (i16)idxNum;
114942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
114943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pCsr->desc==0 );
114944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) return rc;
114945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK && pCsr->nDoclist>0 && idxStr && idxStr[0]=='D' ){
114946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 iDocid = 0;
114947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *csr = pCsr->aDoclist;
114948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( csr<&pCsr->aDoclist[pCsr->nDoclist] ){
114949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint(&csr, &iDocid);
114950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
114951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->pNextId = csr;
114952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->iPrevId = iDocid;
114953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->desc = 1;
114954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->isRequireSeek = 1;
114955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->isMatchinfoNeeded = 1;
114956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->eEvalmode = FTS3_EVAL_NEXT;
114957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
114958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) return rc;
115579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114959 115581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return fts3NextMethod(pCursor);
114960 115582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114961 115583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114962 115584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
114963 115585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This is the xEof method of the virtual table. SQLite calls this
@@ -114973,20 +115595,11 @@
114973 115595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** exposes %_content.docid as the rowid for the virtual table. The
114974 115596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** rowid should be written to *pRowid.
114975 115597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
114976 115598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3RowidMethod(sqlite3_vtab_cursor *pCursor, sqlite_int64 *pRowid){
114977 115599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Cursor *pCsr = (Fts3Cursor *) pCursor;
114978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr->aDoclist ){
114979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pRowid = pCsr->iPrevId;
114980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
114981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* This branch runs if the query is implemented using a full-table scan
114982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** (not using the full-text index). In this case grab the rowid from the
114983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** SELECT statement.
114984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
114985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pCsr->isRequireSeek==0 );
114986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pRowid = sqlite3_column_int64(pCsr->pStmt, 0);
114987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRowid = pCsr->iPrevId;
114988 115601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
114989 115602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
114990 115603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
114991 115604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
114992 115605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This is the xColumn method, called by SQLite to request a value from
@@ -114995,11 +115608,11 @@
114995 115608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3ColumnMethod(
114996 115609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab_cursor *pCursor, /* Cursor to retrieve value from */
114997 115610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_context *pContext, /* Context for sqlite3_result_xxx() calls */
114998 115611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iCol /* Index of column to read value from */
114999 115612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
115000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc; /* Return Code */
115613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Return Code */
115001 115614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Cursor *pCsr = (Fts3Cursor *) pCursor;
115002 115615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *p = (Fts3Table *)pCursor->pVtab;
115003 115616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115004 115617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The column value supplied by SQLite must be in range. */
115005 115618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( iCol>=0 && iCol<=p->nColumn+1 );
@@ -115006,25 +115619,24 @@
115006 115619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115007 115620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iCol==p->nColumn+1 ){
115008 115621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* This call is a request for the "docid" column. Since "docid" is an
115009 115622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** alias for "rowid", use the xRowid() method to obtain the value.
115010 115623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
115011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 iRowid;
115012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3RowidMethod(pCursor, &iRowid);
115013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_result_int64(pContext, iRowid);
115624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_result_int64(pContext, pCsr->iPrevId);
115014 115625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( iCol==p->nColumn ){
115015 115626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The extra column whose name is the same as the table.
115016 115627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return a blob which is a pointer to the cursor.
115017 115628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
115018 115629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_result_blob(pContext, &pCsr, sizeof(pCsr), SQLITE_TRANSIENT);
115019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_OK;
115020 115630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
115021 115631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = fts3CursorSeek(0, pCsr);
115022 115632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
115023 115633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_result_value(pContext, sqlite3_column_value(pCsr->pStmt, iCol+1));
115024 115634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
115025 115635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
115636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( ((Fts3Table *)pCsr->base.pVtab)->pSegments==0 );
115026 115638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
115027 115639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
115028 115640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115029 115641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
115030 115642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function is the implementation of the xUpdate callback used by
@@ -115052,12 +115664,13 @@
115052 115664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115053 115665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
115054 115666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Implementation of xBegin() method. This is a no-op.
115055 115667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
115056 115668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3BeginMethod(sqlite3_vtab *pVtab){
115057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UNUSED_PARAMETER(pVtab);
115058 115669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TESTONLY( Fts3Table *p = (Fts3Table*)pVtab );
115670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UNUSED_PARAMETER(pVtab);
115671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p->pSegments==0 );
115059 115672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->nPendingData==0 );
115060 115673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->inTransaction!=1 );
115061 115674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TESTONLY( p->inTransaction = 1 );
115062 115675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TESTONLY( p->mxSavepoint = -1; );
115063 115676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
@@ -115067,14 +115680,15 @@
115067 115680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Implementation of xCommit() method. This is a no-op. The contents of
115068 115681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the pending-terms hash-table have already been flushed into the database
115069 115682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** by fts3SyncMethod().
115070 115683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
115071 115684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3CommitMethod(sqlite3_vtab *pVtab){
115072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- UNUSED_PARAMETER(pVtab);
115073 115685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TESTONLY( Fts3Table *p = (Fts3Table*)pVtab );
115686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ UNUSED_PARAMETER(pVtab);
115074 115687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->nPendingData==0 );
115075 115688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->inTransaction!=0 );
115689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p->pSegments==0 );
115076 115690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TESTONLY( p->inTransaction = 0 );
115077 115691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TESTONLY( p->mxSavepoint = -1; );
115078 115692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
115079 115693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
115080 115694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -115088,132 +115702,30 @@
115088 115702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->inTransaction!=0 );
115089 115703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TESTONLY( p->inTransaction = 0 );
115090 115704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TESTONLY( p->mxSavepoint = -1; );
115091 115705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
115092 115706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
115093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
115094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
115095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Load the doclist associated with expression pExpr to pExpr->aDoclist.
115096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The loaded doclist contains positions as well as the document ids.
115097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This is used by the matchinfo(), snippet() and offsets() auxillary
115098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** functions.
115099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
115100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3ExprLoadDoclist(Fts3Cursor *pCsr, Fts3Expr *pExpr){
115101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc;
115102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pExpr->eType==FTSQUERY_PHRASE && pExpr->pPhrase );
115103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pCsr->eEvalmode==FTS3_EVAL_NEXT );
115104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3EvalExpr(pCsr, pExpr, &pExpr->aDoclist, &pExpr->nDoclist, 1);
115105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
115106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
115108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3ExprLoadFtDoclist(
115109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Cursor *pCsr,
115110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Expr *pExpr,
115111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char **paDoclist,
115112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pnDoclist
115113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
115114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc;
115115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pCsr->eEvalmode==FTS3_EVAL_NEXT );
115116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pExpr->eType==FTSQUERY_PHRASE && pExpr->pPhrase );
115117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->eEvalmode = FTS3_EVAL_MATCHINFO;
115118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3EvalExpr(pCsr, pExpr, paDoclist, pnDoclist, 1);
115119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->eEvalmode = FTS3_EVAL_NEXT;
115120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
115121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
115123 115707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115124 115708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
115125 115709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** When called, *ppPoslist must point to the byte immediately following the
115126 115710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** end of a position-list. i.e. ( (*ppPoslist)[-1]==POS_END ). This function
115127 115711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** moves *ppPoslist so that it instead points to the first byte of the
115128 115712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** same position list.
115129 115713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
115130 115714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static void fts3ReversePoslist(char *pStart, char **ppPoslist){
115131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *p = &(*ppPoslist)[-3];
115132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char c = p[1];
115715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p = &(*ppPoslist)[-2];
115716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char c;
115717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( p>pStart && (c=*p--)==0 );
115133 115719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( p>pStart && (*p & 0x80) | c ){
115134 115720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
c = *p--;
115135 115721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
115136 115722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p>pStart ){ p = &p[2]; }
115137 115723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( *p++&0x80 );
115138 115724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*ppPoslist = p;
115139 115725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
115140 115726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
115142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
115143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** After ExprLoadDoclist() (see above) has been called, this function is
115144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** used to iterate/search through the position lists that make up the doclist
115145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** stored in pExpr->aDoclist.
115146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
115147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE char *sqlite3Fts3FindPositions(
115148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Cursor *pCursor, /* Associate FTS3 cursor */
115149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Expr *pExpr, /* Access this expressions doclist */
115150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 iDocid, /* Docid associated with requested pos-list */
115151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iCol /* Column of requested pos-list */
115152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
115153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pExpr->isLoaded );
115154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->aDoclist ){
115155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pEnd = &pExpr->aDoclist[pExpr->nDoclist];
115156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pCsr;
115157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
115158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->pCurrent==0 ){
115159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCursor->desc==0 ){
115160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pExpr->pCurrent = pExpr->aDoclist;
115161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pExpr->iCurrent = 0;
115162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint(&pExpr->pCurrent, &pExpr->iCurrent);
115163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
115164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr = pExpr->aDoclist;
115165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( pCsr<pEnd ){
115166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint(&pCsr, &pExpr->iCurrent);
115167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PoslistCopy(0, &pCsr);
115168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3ReversePoslist(pExpr->aDoclist, &pCsr);
115170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pExpr->pCurrent = pCsr;
115171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr = pExpr->pCurrent;
115174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pCsr );
115175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
115176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( (pCursor->desc==0 && pCsr<pEnd)
115177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || (pCursor->desc && pCsr>pExpr->aDoclist)
115178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
115179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCursor->desc==0 && pExpr->iCurrent<iDocid ){
115180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3PoslistCopy(0, &pCsr);
115181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr<pEnd ){
115182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetDeltaVarint(&pCsr, &pExpr->iCurrent);
115183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pExpr->pCurrent = pCsr;
115185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( pCursor->desc && pExpr->iCurrent>iDocid ){
115186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3GetReverseDeltaVarint(&pCsr, pExpr->aDoclist, &pExpr->iCurrent);
115187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3ReversePoslist(pExpr->aDoclist, &pCsr);
115188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pExpr->pCurrent = pCsr;
115189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
115190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->iCurrent==iDocid ){
115191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iThis = 0;
115192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iCol<0 ){
115193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If iCol is negative, return a pointer to the start of the
115194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** position-list (instead of a pointer to the start of a list
115195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of offsets associated with a specific column).
115196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
115197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return pCsr;
115198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( iThis<iCol ){
115200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3ColumnlistCopy(0, &pCsr);
115201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( *pCsr==0x00 ) return 0;
115202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr++;
115203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr += sqlite3Fts3GetVarint32(pCsr, &iThis);
115204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iCol==iThis && (*pCsr&0xFE) ) return pCsr;
115206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 0;
115208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
115212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 0;
115213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
115214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
115215 115727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
115216 115728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Helper function used by the implementation of the overloaded snippet(),
115217 115729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** offsets() and optimize() SQL functions.
115218 115730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
115219 115731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If the value passed as the third argument is a blob of size
@@ -115440,27 +115952,43 @@
115440 115952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->zDb, p->zName, zName
115441 115953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
115442 115954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
115443 115955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
115444 115956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
115958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The xSavepoint() method.
115959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
115960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Flush the contents of the pending-terms table to disk.
115961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
115445 115962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3SavepointMethod(sqlite3_vtab *pVtab, int iSavepoint){
115446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Table *p = (Fts3Table*)pVtab;
115447 115963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(iSavepoint);
115448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( p->inTransaction );
115449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( p->mxSavepoint < iSavepoint );
115450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- TESTONLY( p->mxSavepoint = iSavepoint );
115451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return sqlite3Fts3PendingTermsFlush(p);
115964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( ((Fts3Table *)pVtab)->inTransaction );
115965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( ((Fts3Table *)pVtab)->mxSavepoint < iSavepoint );
115966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ TESTONLY( ((Fts3Table *)pVtab)->mxSavepoint = iSavepoint );
115967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return fts3SyncMethod(pVtab);
115452 115968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
115969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
115971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The xRelease() method.
115972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
115973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This is a no-op.
115974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
115453 115975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3ReleaseMethod(sqlite3_vtab *pVtab, int iSavepoint){
115454 115976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TESTONLY( Fts3Table *p = (Fts3Table*)pVtab );
115455 115977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(iSavepoint);
115456 115978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(pVtab);
115457 115979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->inTransaction );
115458 115980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->mxSavepoint >= iSavepoint );
115459 115981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
TESTONLY( p->mxSavepoint = iSavepoint-1 );
115460 115982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
115461 115983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
115984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
115985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
115986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The xRollbackTo() method.
115987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
115988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Discard the contents of the pending terms table.
115989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
115462 115990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3RollbackToMethod(sqlite3_vtab *pVtab, int iSavepoint){
115463 115991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *p = (Fts3Table*)pVtab;
115464 115992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(iSavepoint);
115465 115993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->inTransaction );
115466 115994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->mxSavepoint >= iSavepoint );
@@ -115605,12 +116133,1553 @@
115605 116133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3HashClear(pHash);
115606 116134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pHash);
115607 116135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
115608 116136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
115609 116137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Allocate an Fts3MultiSegReader for each token in the expression headed
116141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by pExpr.
116142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** An Fts3SegReader object is a cursor that can seek or scan a range of
116144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** entries within a single segment b-tree. An Fts3MultiSegReader uses multiple
116145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fts3SegReader objects internally to provide an interface to seek or scan
116146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** within the union of all segments of a b-tree. Hence the name.
116147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the allocated Fts3MultiSegReader just seeks to a single entry in a
116149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** segment b-tree (if the term is not a prefix or it is a prefix for which
116150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** there exists prefix b-tree of the right length) then it may be traversed
116151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and merged incrementally. Otherwise, it has to be merged into an in-memory
116152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** doclist and then traversed.
116153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3EvalAllocateReaders(
116155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *pCsr, /* FTS cursor handle */
116156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pExpr, /* Allocate readers for this expression */
116157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pnToken, /* OUT: Total number of tokens in phrase. */
116158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pnOr, /* OUT: Total number of OR nodes in expr. */
116159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pRc /* IN/OUT: Error code */
116160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
116161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr && SQLITE_OK==*pRc ){
116162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr->eType==FTSQUERY_PHRASE ){
116163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
116164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nToken = pExpr->pPhrase->nToken;
116165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnToken += nToken;
116166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<nToken; i++){
116167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3PhraseToken *pToken = &pExpr->pPhrase->aToken[i];
116168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = fts3TermSegReaderCursor(pCsr,
116169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pToken->z, pToken->n, pToken->isPrefix, &pToken->pSegcsr
116170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
116171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ){
116172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRc = rc;
116173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return;
116174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pExpr->pPhrase->iDoclistToken==0 );
116177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->pPhrase->iDoclistToken = -1;
116178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnOr += (pExpr->eType==FTSQUERY_OR);
116180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalAllocateReaders(pCsr, pExpr->pLeft, pnToken, pnOr, pRc);
116181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalAllocateReaders(pCsr, pExpr->pRight, pnToken, pnOr, pRc);
116182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Arguments pList/nList contain the doclist for token iToken of phrase p.
116188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** It is merged into the main doclist stored in p->doclist.aAll/nAll.
116189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function assumes that pList points to a buffer allocated using
116191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3_malloc(). This function takes responsibility for eventually
116192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** freeing the buffer.
116193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3EvalPhraseMergeToken(
116195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *pTab, /* FTS Table pointer */
116196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *p, /* Phrase to merge pList/nList into */
116197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iToken, /* Token pList/nList corresponds to */
116198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pList, /* Pointer to doclist */
116199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nList /* Number of bytes in pList */
116200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
116201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iToken!=p->iDoclistToken );
116202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pList==0 ){
116204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p->doclist.aAll);
116205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->doclist.aAll = 0;
116206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->doclist.nAll = 0;
116207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if( p->iDoclistToken<0 ){
116210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->doclist.aAll = pList;
116211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->doclist.nAll = nList;
116212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else if( p->doclist.aAll==0 ){
116215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pList);
116216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ else {
116219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pLeft;
116220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pRight;
116221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nLeft;
116222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRight;
116223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nDiff;
116224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->iDoclistToken<iToken ){
116226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pLeft = p->doclist.aAll;
116227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nLeft = p->doclist.nAll;
116228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRight = pList;
116229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nRight = nList;
116230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nDiff = iToken - p->iDoclistToken;
116231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRight = p->doclist.aAll;
116233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nRight = p->doclist.nAll;
116234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pLeft = pList;
116235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nLeft = nList;
116236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nDiff = p->iDoclistToken - iToken;
116237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3DoclistPhraseMerge(pTab->bDescIdx, nDiff, pLeft, nLeft, pRight,&nRight);
116240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pLeft);
116241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->doclist.aAll = pRight;
116242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->doclist.nAll = nRight;
116243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iToken>p->iDoclistToken ) p->iDoclistToken = iToken;
116246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Load the doclist for phrase p into p->doclist.aAll/nAll. The loaded doclist
116250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** does not take deferred tokens into account.
116251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code.
116253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalPhraseLoad(
116255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *pCsr, /* FTS Cursor handle */
116256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *p /* Phrase object */
116257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
116258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
116259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iToken;
116260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
116261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iToken=0; rc==SQLITE_OK && iToken<p->nToken; iToken++){
116263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3PhraseToken *pToken = &p->aToken[iToken];
116264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pToken->pDeferred==0 || pToken->pSegcsr==0 );
116265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pToken->pSegcsr ){
116267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nThis = 0;
116268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pThis = 0;
116269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3TermSelect(pTab, pToken, p->iColumn, &nThis, &pThis);
116270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
116271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalPhraseMergeToken(pTab, p, iToken, pThis, nThis);
116272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pToken->pSegcsr==0 );
116275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
116278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called on each phrase after the position lists for
116282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** any deferred tokens have been loaded into memory. It updates the phrases
116283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** current position list to include only those positions that are really
116284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** instances of the phrase (after considering deferred tokens). If this
116285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** means that the phrase does not appear in the current row, doclist.pList
116286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** and doclist.nList are both zeroed.
116287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code.
116289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalDeferredPhrase(Fts3Cursor *pCsr, Fts3Phrase *pPhrase){
116291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iToken; /* Used to iterate through phrase tokens */
116292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Return code */
116293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aPoslist = 0; /* Position list for deferred tokens */
116294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nPoslist = 0; /* Number of bytes in aPoslist */
116295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iPrev = -1; /* Token number of previous deferred token */
116296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPhrase->doclist.bFreeList==0 );
116298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iToken=0; rc==SQLITE_OK && iToken<pPhrase->nToken; iToken++){
116300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3PhraseToken *pToken = &pPhrase->aToken[iToken];
116301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3DeferredToken *pDeferred = pToken->pDeferred;
116302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pDeferred ){
116304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pList;
116305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nList;
116306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3DeferredTokenList(pDeferred, &pList, &nList);
116307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) return rc;
116308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pList==0 ){
116310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(aPoslist);
116311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.pList = 0;
116312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.nList = 0;
116313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
116314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( aPoslist==0 ){
116316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aPoslist = pList;
116317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nPoslist = nList;
116318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aOut = pList;
116321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p1 = aPoslist;
116322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p2 = aOut;
116323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iPrev>=0 );
116325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistPhraseMerge(&aOut, iToken-iPrev, 0, 1, &p1, &p2);
116326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(aPoslist);
116327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aPoslist = pList;
116328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nPoslist = aOut - aPoslist;
116329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nPoslist==0 ){
116330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(aPoslist);
116331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.pList = 0;
116332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.nList = 0;
116333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
116334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iPrev = iToken;
116337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iPrev>=0 ){
116341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nMaxUndeferred = pPhrase->iDoclistToken;
116342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nMaxUndeferred<0 ){
116343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.pList = aPoslist;
116344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.nList = nPoslist;
116345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.iDocid = pCsr->iPrevId;
116346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.bFreeList = 1;
116347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nDistance;
116349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p1;
116350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p2;
116351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aOut;
116352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nMaxUndeferred>iPrev ){
116354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p1 = aPoslist;
116355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p2 = pPhrase->doclist.pList;
116356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nDistance = nMaxUndeferred - iPrev;
116357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p1 = pPhrase->doclist.pList;
116359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p2 = aPoslist;
116360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nDistance = iPrev - nMaxUndeferred;
116361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aOut = (char *)sqlite3_malloc(nPoslist+8);
116364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !aOut ){
116365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(aPoslist);
116366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_NOMEM;
116367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.pList = aOut;
116370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fts3PoslistPhraseMerge(&aOut, nDistance, 0, 1, &p1, &p2) ){
116371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.bFreeList = 1;
116372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.nList = (aOut - pPhrase->doclist.pList);
116373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(aOut);
116375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.pList = 0;
116376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.nList = 0;
116377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(aPoslist);
116379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
116383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called for each Fts3Phrase in a full-text query
116387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expression to initialize the mechanism for returning rows. Once this
116388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** function has been called successfully on an Fts3Phrase, it may be
116389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** used with fts3EvalPhraseNext() to iterate through the matching docids.
116390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If parameter bOptOk is true, then the phrase may (or may not) use the
116392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** incremental loading strategy. Otherwise, the entire doclist is loaded into
116393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** memory within this call.
116394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_OK is returned if no error occurs, otherwise an SQLite error code.
116396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalPhraseStart(Fts3Cursor *pCsr, int bOptOk, Fts3Phrase *p){
116398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Error code */
116399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3PhraseToken *pFirst = &p->aToken[0];
116400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
116401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pCsr->bDesc==pTab->bDescIdx
116403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && bOptOk==1
116404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && p->nToken==1
116405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && pFirst->pSegcsr
116406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && pFirst->pSegcsr->bLookup
116407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
116408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Use the incremental approach. */
116409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iCol = (p->iColumn >= pTab->nColumn ? -1 : p->iColumn);
116410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3MsrIncrStart(
116411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTab, pFirst->pSegcsr, iCol, pFirst->z, pFirst->n);
116412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->bIncr = 1;
116413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Load the full doclist for the phrase into memory. */
116416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3EvalPhraseLoad(pCsr, p);
116417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->bIncr = 0;
116418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( rc!=SQLITE_OK || p->nToken<1 || p->aToken[0].pSegcsr==0 || p->bIncr );
116421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
116422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is used to iterate backwards (from the end to start)
116426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** through doclists. It is used by this module to iterate through phrase
116427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** doclists in reverse and by the fts3_write.c module to iterate through
116428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pending-terms lists when writing to databases with "order=desc".
116429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The doclist may be sorted in ascending (parameter bDescIdx==0) or
116431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** descending (parameter bDescIdx==1) order of docid. Regardless, this
116432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** function iterates from the end of the doclist to the beginning.
116433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3Fts3DoclistPrev(
116435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bDescIdx, /* True if the doclist is desc */
116436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aDoclist, /* Pointer to entire doclist */
116437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nDoclist, /* Length of aDoclist in bytes */
116438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char **ppIter, /* IN/OUT: Iterator pointer */
116439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 *piDocid, /* IN/OUT: Docid pointer */
116440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pnList, /* IN/OUT: List length pointer */
116441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *pbEof /* OUT: End-of-file flag */
116442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
116443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p = *ppIter;
116444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( nDoclist>0 );
116446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( *pbEof==0 );
116447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p || *piDocid==0 );
116448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !p || (p>aDoclist && p<&aDoclist[nDoclist]) );
116449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p==0 ){
116451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iDocid = 0;
116452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pNext = 0;
116453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pDocid = aDoclist;
116454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pEnd = &aDoclist[nDoclist];
116455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iMul = 1;
116456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pDocid<pEnd ){
116458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iDelta;
116459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDocid += sqlite3Fts3GetVarint(pDocid, &iDelta);
116460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iDocid += (iMul * iDelta);
116461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pNext = pDocid;
116462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistCopy(0, &pDocid);
116463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pDocid<pEnd && *pDocid==0 ) pDocid++;
116464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iMul = (bDescIdx ? -1 : 1);
116465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnList = pEnd - pNext;
116468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *ppIter = pNext;
116469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piDocid = iDocid;
116470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iMul = (bDescIdx ? -1 : 1);
116472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iDelta;
116473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3GetReverseVarint(&p, aDoclist, &iDelta);
116474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piDocid -= (iMul * iDelta);
116475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p==aDoclist ){
116477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pbEof = 1;
116478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pSave = p;
116480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3ReversePoslist(aDoclist, &p);
116481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnList = (pSave - p);
116482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *ppIter = p;
116484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Attempt to move the phrase iterator to point to the next matching docid.
116489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If an error occurs, return an SQLite error code. Otherwise, return
116490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_OK.
116491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If there is no "next" entry and no error occurs, then *pbEof is set to
116493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1 before returning. Otherwise, if no error occurs and the iterator is
116494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** successfully advanced, *pbEof is set to 0.
116495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalPhraseNext(
116497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *pCsr, /* FTS Cursor handle */
116498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *p, /* Phrase object to advance to next docid */
116499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 *pbEof /* OUT: Set to 1 if EOF */
116500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
116501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
116502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Doclist *pDL = &p->doclist;
116503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
116504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->bIncr ){
116506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p->nToken==1 );
116507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pDL->pNextDocid==0 );
116508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3MsrIncrNext(pTab, p->aToken[0].pSegcsr,
116509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ &pDL->iDocid, &pDL->pList, &pDL->nList
116510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
116511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && !pDL->pList ){
116512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pbEof = 1;
116513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( pCsr->bDesc!=pTab->bDescIdx && pDL->nAll ){
116515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Fts3DoclistPrev(pTab->bDescIdx, pDL->aAll, pDL->nAll,
116516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ &pDL->pNextDocid, &pDL->iDocid, &pDL->nList, pbEof
116517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
116518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDL->pList = pDL->pNextDocid;
116519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pIter; /* Used to iterate through aAll */
116521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pEnd = &pDL->aAll[pDL->nAll]; /* 1 byte past end of aAll */
116522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pDL->pNextDocid ){
116523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIter = pDL->pNextDocid;
116524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIter = pDL->aAll;
116526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pIter>=pEnd ){
116529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* We have already reached the end of this doclist. EOF. */
116530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pbEof = 1;
116531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iDelta;
116533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIter += sqlite3Fts3GetVarint(pIter, &iDelta);
116534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pTab->bDescIdx==0 || pDL->pNextDocid==0 ){
116535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDL->iDocid += iDelta;
116536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDL->iDocid -= iDelta;
116538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDL->pList = pIter;
116540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PoslistCopy(0, &pIter);
116541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDL->nList = (pIter - pDL->pList);
116542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* pIter now points just past the 0x00 that terminates the position-
116544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** list for document pDL->iDocid. However, if this position-list was
116545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** edited in place by fts3EvalNearTrim(), then pIter may not actually
116546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** point to the start of the next docid value. The following line deals
116547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** with this case by advancing pIter past the zero-padding added by
116548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fts3EvalNearTrim(). */
116549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pIter<pEnd && *pIter==0 ) pIter++;
116550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pDL->pNextDocid = pIter;
116552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pIter>=&pDL->aAll[pDL->nAll] || *pIter );
116553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pbEof = 0;
116554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
116558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
116563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Otherwise, fts3EvalPhraseStart() is called on all phrases within the
116564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expression. Also the Fts3Expr.bDeferred variable is set to true for any
116565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expressions for which all descendent tokens are deferred.
116566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If parameter bOptOk is zero, then it is guaranteed that the
116568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fts3Phrase.doclist.aAll/nAll variables contain the entire doclist for
116569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** each phrase in the expression (subject to deferred token processing).
116570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Or, if bOptOk is non-zero, then one or more tokens within the expression
116571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** may be loaded incrementally, meaning doclist.aAll/nAll is not available.
116572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If an error occurs within this function, *pRc is set to an SQLite error
116574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** code before returning.
116575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3EvalStartReaders(
116577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *pCsr, /* FTS Cursor handle */
116578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pExpr, /* Expression to initialize phrases in */
116579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bOptOk, /* True to enable incremental loading */
116580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pRc /* IN/OUT: Error code */
116581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
116582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr && SQLITE_OK==*pRc ){
116583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr->eType==FTSQUERY_PHRASE ){
116584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
116585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nToken = pExpr->pPhrase->nToken;
116586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<nToken; i++){
116587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr->pPhrase->aToken[i].pDeferred==0 ) break;
116588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->bDeferred = (i==nToken);
116590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRc = fts3EvalPhraseStart(pCsr, bOptOk, pExpr->pPhrase);
116591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalStartReaders(pCsr, pExpr->pLeft, bOptOk, pRc);
116593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalStartReaders(pCsr, pExpr->pRight, bOptOk, pRc);
116594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->bDeferred = (pExpr->pLeft->bDeferred && pExpr->pRight->bDeferred);
116595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** An array of the following structures is assembled as part of the process
116601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of selecting tokens to defer before the query starts executing (as part
116602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the xFilter() method). There is one element in the array for each
116603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** token in the FTS expression.
116604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Tokens are divided into AND/NEAR clusters. All tokens in a cluster belong
116606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to phrases that are connected only by AND and NEAR operators (not OR or
116607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** NOT). When determining tokens to defer, each AND/NEAR cluster is considered
116608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** separately. The root of a tokens AND/NEAR cluster is stored in
116609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fts3TokenAndCost.pRoot.
116610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typedef struct Fts3TokenAndCost Fts3TokenAndCost;
116612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Fts3TokenAndCost {
116613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *pPhrase; /* The phrase the token belongs to */
116614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iToken; /* Position of token in phrase */
116615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3PhraseToken *pToken; /* The token itself */
116616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pRoot; /* Root of NEAR/AND cluster */
116617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nOvfl; /* Number of overflow pages to load doclist */
116618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iCol; /* The column the token must match */
116619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ };
116620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is used to populate an allocated Fts3TokenAndCost array.
116623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
116625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Otherwise, if an error occurs during execution, *pRc is set to an
116626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLite error code.
116627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3EvalTokenCosts(
116629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *pCsr, /* FTS Cursor handle */
116630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pRoot, /* Root of current AND/NEAR cluster */
116631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pExpr, /* Expression to consider */
116632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3TokenAndCost **ppTC, /* Write new entries to *(*ppTC)++ */
116633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr ***ppOr, /* Write new OR root to *(*ppOr)++ */
116634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pRc /* IN/OUT: Error code */
116635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
116636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *pRc==SQLITE_OK && pExpr ){
116637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr->eType==FTSQUERY_PHRASE ){
116638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *pPhrase = pExpr->pPhrase;
116639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
116640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; *pRc==SQLITE_OK && i<pPhrase->nToken; i++){
116641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3TokenAndCost *pTC = (*ppTC)++;
116642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTC->pPhrase = pPhrase;
116643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTC->iToken = i;
116644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTC->pRoot = pRoot;
116645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTC->pToken = &pPhrase->aToken[i];
116646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTC->iCol = pPhrase->iColumn;
116647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRc = sqlite3Fts3MsrOvfl(pCsr, pTC->pToken->pSegcsr, &pTC->nOvfl);
116648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( pExpr->eType!=FTSQUERY_NOT ){
116650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr->eType==FTSQUERY_OR ){
116651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRoot = pExpr->pLeft;
116652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **ppOr = pRoot;
116653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (*ppOr)++;
116654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalTokenCosts(pCsr, pRoot, pExpr->pLeft, ppTC, ppOr, pRc);
116656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr->eType==FTSQUERY_OR ){
116657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRoot = pExpr->pRight;
116658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **ppOr = pRoot;
116659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (*ppOr)++;
116660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalTokenCosts(pCsr, pRoot, pExpr->pRight, ppTC, ppOr, pRc);
116662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Determine the average document (row) size in pages. If successful,
116668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** write this value to *pnPage and return SQLITE_OK. Otherwise, return
116669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** an SQLite error code.
116670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The average document size in pages is calculated by first calculating
116672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** determining the average size in bytes, B. If B is less than the amount
116673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of data that will fit on a single leaf page of an intkey table in
116674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** this database, then the average docsize is 1. Otherwise, it is 1 plus
116675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the number of overflow pages consumed by a record B bytes in size.
116676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalAverageDocsize(Fts3Cursor *pCsr, int *pnPage){
116678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pCsr->nRowAvg==0 ){
116679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The average document size, which is required to calculate the cost
116680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of each doclist, has not yet been determined. Read the required
116681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** data from the %_stat table to calculate it.
116682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Entry 0 of the %_stat table is a blob containing (nCol+1) FTS3
116684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** varints, where nCol is the number of columns in the FTS3 table.
116685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The first varint is the number of documents currently stored in
116686 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the table. The following nCol varints contain the total amount of
116687 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** data stored in all rows of each column of the table, from left
116688 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to right.
116689 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116690 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
116691 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *p = (Fts3Table*)pCsr->base.pVtab;
116692 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_stmt *pStmt;
116693 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 nDoc = 0;
116694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 nByte = 0;
116695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *pEnd;
116696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *a;
116697 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116698 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3SelectDoctotal(p, &pStmt);
116699 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) return rc;
116700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a = sqlite3_column_blob(pStmt, 0);
116701 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( a );
116702 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pEnd = &a[sqlite3_column_bytes(pStmt, 0)];
116704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a += sqlite3Fts3GetVarint(a, &nDoc);
116705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( a<pEnd ){
116706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ a += sqlite3Fts3GetVarint(a, &nByte);
116707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nDoc==0 || nByte==0 ){
116709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_reset(pStmt);
116710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_CORRUPT_VTAB;
116711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116713 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->nDoc = nDoc;
116714 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->nRowAvg = (int)(((nByte / nDoc) + p->nPgsz) / p->nPgsz);
116715 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pCsr->nRowAvg>0 );
116716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3_reset(pStmt);
116717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) return rc;
116718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnPage = pCsr->nRowAvg;
116721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
116722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called to select the tokens (if any) that will be
116726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** deferred. The array aTC[] has already been populated when this is
116727 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** called.
116728 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116729 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called once for each AND/NEAR cluster in the
116730 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expression. Each invocation determines which tokens to defer within
116731 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the cluster with root node pRoot. See comments above the definition
116732 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of struct Fts3TokenAndCost for more details.
116733 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116734 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If no error occurs, SQLITE_OK is returned and sqlite3Fts3DeferToken()
116735 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** called on each token to defer. Otherwise, an SQLite error code is
116736 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** returned.
116737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalSelectDeferred(
116739 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *pCsr, /* FTS Cursor handle */
116740 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pRoot, /* Consider tokens with this root node */
116741 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3TokenAndCost *aTC, /* Array of expression tokens and costs */
116742 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nTC /* Number of entries in aTC[] */
116743 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
116744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
116745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nDocSize = 0; /* Number of pages per doc loaded */
116746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Return code */
116747 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ii; /* Iterator variable for various purposes */
116748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nOvfl = 0; /* Total overflow pages used by doclists */
116749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nToken = 0; /* Total number of tokens in cluster */
116750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nMinEst = 0; /* The minimum count for any phrase so far. */
116752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nLoad4 = 1; /* (Phrases that will be loaded)^4. */
116753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Count the tokens in this AND/NEAR cluster. If none of the doclists
116755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** associated with the tokens spill onto overflow pages, or if there is
116756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** only 1 token, exit early. No tokens to defer in this case. */
116757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(ii=0; ii<nTC; ii++){
116758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aTC[ii].pRoot==pRoot ){
116759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nOvfl += aTC[ii].nOvfl;
116760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nToken++;
116761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nOvfl==0 || nToken<2 ) return SQLITE_OK;
116764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Obtain the average docsize (in pages). */
116766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3EvalAverageDocsize(pCsr, &nDocSize);
116767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( rc!=SQLITE_OK || nDocSize>0 );
116768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Iterate through all tokens in this AND/NEAR cluster, in ascending order
116771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the number of overflow pages that will be loaded by the pager layer
116772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to retrieve the entire doclist for the token from the full-text index.
116773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Load the doclists for tokens that are either:
116774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a. The cheapest token in the entire query (i.e. the one visited by the
116776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** first iteration of this loop), or
116777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** b. Part of a multi-token phrase.
116779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** After each token doclist is loaded, merge it with the others from the
116781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** same phrase and count the number of documents that the merged doclist
116782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** contains. Set variable "nMinEst" to the smallest number of documents in
116783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** any phrase doclist for which 1 or more token doclists have been loaded.
116784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Let nOther be the number of other phrases for which it is certain that
116785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** one or more tokens will not be deferred.
116786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Then, for each token, defer it if loading the doclist would result in
116788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** loading N or more overflow pages into memory, where N is computed as:
116789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (nMinEst + 4^nOther - 1) / (4^nOther)
116791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(ii=0; ii<nToken && rc==SQLITE_OK; ii++){
116793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iTC; /* Used to iterate through aTC[] array. */
116794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3TokenAndCost *pTC = 0; /* Set to cheapest remaining token. */
116795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Set pTC to point to the cheapest remaining token. */
116797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iTC=0; iTC<nTC; iTC++){
116798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aTC[iTC].pToken && aTC[iTC].pRoot==pRoot
116799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (!pTC || aTC[iTC].nOvfl<pTC->nOvfl)
116800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
116801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTC = &aTC[iTC];
116802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pTC );
116805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ii && pTC->nOvfl>=((nMinEst+(nLoad4/4)-1)/(nLoad4/4))*nDocSize ){
116807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The number of overflow pages to load for this (and therefore all
116808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** subsequent) tokens is greater than the estimated number of pages
116809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that will be loaded if all subsequent tokens are deferred.
116810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3PhraseToken *pToken = pTC->pToken;
116812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3DeferToken(pCsr, pToken, pTC->iCol);
116813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3SegReaderCursorFree(pToken->pSegcsr);
116814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pToken->pSegcsr = 0;
116815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nLoad4 = nLoad4*4;
116817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ii==0 || pTC->pPhrase->nToken>1 ){
116818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Either this is the cheapest token in the entire query, or it is
116819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** part of a multi-token phrase. Either way, the entire doclist will
116820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (eventually) be loaded into memory. It may as well be now. */
116821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3PhraseToken *pToken = pTC->pToken;
116822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nList = 0;
116823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pList = 0;
116824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3TermSelect(pTab, pToken, pTC->iCol, &nList, &pList);
116825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( rc==SQLITE_OK || pList==0 );
116826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
116827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nCount;
116828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalPhraseMergeToken(pTab, pTC->pPhrase, pTC->iToken,pList,nList);
116829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nCount = fts3DoclistCountDocids(
116830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTC->pPhrase->doclist.aAll, pTC->pPhrase->doclist.nAll
116831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
116832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ii==0 || nCount<nMinEst ) nMinEst = nCount;
116833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pTC->pToken = 0;
116837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
116840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called from within the xFilter method. It initializes
116844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the full-text query currently stored in pCsr->pExpr. To iterate through
116845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the results of a query, the caller does:
116846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fts3EvalStart(pCsr);
116848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** while( 1 ){
116849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fts3EvalNext(pCsr);
116850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if( pCsr->bEof ) break;
116851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ... return row pCsr->iPrevId to the caller ...
116852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** }
116853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalStart(Fts3Cursor *pCsr){
116855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
116856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
116857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nToken = 0;
116858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nOr = 0;
116859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Allocate a MultiSegReader for each token in the expression. */
116861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalAllocateReaders(pCsr, pCsr->pExpr, &nToken, &nOr, &rc);
116862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Determine which, if any, tokens in the expression should be deferred. */
116864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && nToken>1 && pTab->bHasStat ){
116865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3TokenAndCost *aTC;
116866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr **apOr;
116867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aTC = (Fts3TokenAndCost *)sqlite3_malloc(
116868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sizeof(Fts3TokenAndCost) * nToken
116869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ + sizeof(Fts3Expr *) * nOr * 2
116870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
116871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ apOr = (Fts3Expr **)&aTC[nToken];
116872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !aTC ){
116874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_NOMEM;
116875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
116876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ii;
116877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3TokenAndCost *pTC = aTC;
116878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr **ppOr = apOr;
116879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalTokenCosts(pCsr, 0, pCsr->pExpr, &pTC, &ppOr, &rc);
116881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nToken = pTC-aTC;
116882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nOr = ppOr-apOr;
116883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
116885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3EvalSelectDeferred(pCsr, 0, aTC, nToken);
116886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(ii=0; rc==SQLITE_OK && ii<nOr; ii++){
116887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3EvalSelectDeferred(pCsr, apOr[ii], aTC, nToken);
116888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(aTC);
116892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalStartReaders(pCsr, pCsr->pExpr, 1, &rc);
116896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
116897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Invalidate the current position list for phrase pPhrase.
116901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3EvalInvalidatePoslist(Fts3Phrase *pPhrase){
116903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPhrase->doclist.bFreeList ){
116904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pPhrase->doclist.pList);
116905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.pList = 0;
116907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.nList = 0;
116908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.bFreeList = 0;
116909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called to edit the position list associated with
116913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the phrase object passed as the fifth argument according to a NEAR
116914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** condition. For example:
116915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** abc NEAR/5 "def ghi"
116917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Parameter nNear is passed the NEAR distance of the expression (5 in
116919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the example above). When this function is called, *paPoslist points to
116920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the position list, and *pnToken is the number of phrase tokens in, the
116921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** phrase on the other side of the NEAR operator to pPhrase. For example,
116922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if pPhrase refers to the "def ghi" phrase, then *paPoslist points to
116923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the position list associated with phrase "abc".
116924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** All positions in the pPhrase position list that are not sufficiently
116926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** close to a position in the *paPoslist position list are removed. If this
116927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** leaves 0 positions, zero is returned. Otherwise, non-zero.
116928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Before returning, *paPoslist is set to point to the position lsit
116930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** associated with pPhrase. And *pnToken is set to the number of tokens in
116931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** pPhrase.
116932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalNearTrim(
116934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nNear, /* NEAR distance. As in "NEAR/nNear". */
116935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aTmp, /* Temporary space to use */
116936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char **paPoslist, /* IN/OUT: Position list */
116937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pnToken, /* IN/OUT: Tokens in phrase of *paPoslist */
116938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *pPhrase /* The phrase object to trim the doclist of */
116939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
116940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nParam1 = nNear + pPhrase->nToken;
116941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nParam2 = nNear + *pnToken;
116942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nNew;
116943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p2;
116944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pOut;
116945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int res;
116946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPhrase->doclist.pList );
116948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p2 = pOut = pPhrase->doclist.pList;
116950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ res = fts3PoslistNearMerge(
116951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ &pOut, aTmp, nParam1, nParam2, paPoslist, &p2
116952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
116953 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( res ){
116954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nNew = (pOut - pPhrase->doclist.pList) - 1;
116955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPhrase->doclist.pList[nNew]=='\0' );
116956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( nNew<=pPhrase->doclist.nList && nNew>0 );
116957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&pPhrase->doclist.pList[nNew], 0, pPhrase->doclist.nList - nNew);
116958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.nList = nNew;
116959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *paPoslist = pPhrase->doclist.pList;
116960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnToken = pPhrase->nToken;
116961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return res;
116964 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
116967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is a no-op if *pRc is other than SQLITE_OK when it is called.
116968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Otherwise, it advances the expression passed as the second argument to
116969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** point to the next matching row in the database. Expressions iterate through
116970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** matching rows in docid order. Ascending order if Fts3Cursor.bDesc is zero,
116971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or descending if it is non-zero.
116972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If an error occurs, *pRc is set to an SQLite error code. Otherwise, if
116974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** successful, the following variables in pExpr are set:
116975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fts3Expr.bEof (non-zero if EOF - there is no next row)
116977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fts3Expr.iDocid (valid if bEof==0. The docid of the next row)
116978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the expression is of type FTSQUERY_PHRASE, and the expression is not
116980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** at EOF, then the following variables are populated with the position list
116981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for the phrase for the visited row:
116982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** FTs3Expr.pPhrase->doclist.nList (length of pList in bytes)
116984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** FTs3Expr.pPhrase->doclist.pList (pointer to position list)
116985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** It says above that this function advances the expression to the next
116987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** matching row. This is usually true, but there are the following exceptions:
116988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1. Deferred tokens are not taken into account. If a phrase consists
116990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** entirely of deferred tokens, it is assumed to match every row in
116991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the db. In this case the position-list is not populated at all.
116992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
116993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Or, if a phrase contains one or more deferred tokens and one or
116994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** more non-deferred tokens, then the expression is advanced to the
116995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** next possible match, considering only non-deferred tokens. In other
116996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** words, if the phrase is "A B C", and "B" is deferred, the expression
116997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is advanced to the next row that contains an instance of "A * C",
116998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** where "*" may match any single token. The position list in this case
116999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is populated as for "A * C" before returning.
117000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2. NEAR is treated as AND. If the expression is "x NEAR y", it is
117002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** advanced to point to the next row that matches "x AND y".
117003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** See fts3EvalTestDeferredAndNear() for details on testing if a row is
117005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** really a match, taking into account deferred tokens and NEAR operators.
117006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3EvalNextRow(
117008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *pCsr, /* FTS Cursor handle */
117009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pExpr, /* Expr. to advance to next matching row */
117010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pRc /* IN/OUT: Error code */
117011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
117012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *pRc==SQLITE_OK ){
117013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bDescDoclist = pCsr->bDesc; /* Used by DOCID_CMP() macro */
117014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pExpr->bEof==0 );
117015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->bStart = 1;
117016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( pExpr->eType ){
117018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case FTSQUERY_NEAR:
117019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case FTSQUERY_AND: {
117020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pLeft = pExpr->pLeft;
117021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pRight = pExpr->pRight;
117022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !pLeft->bDeferred || !pRight->bDeferred );
117023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pLeft->bDeferred ){
117025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* LHS is entirely deferred. So we assume it matches every row.
117026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Advance the RHS iterator to find the next row visited. */
117027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pRight, pRc);
117028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->iDocid = pRight->iDocid;
117029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->bEof = pRight->bEof;
117030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( pRight->bDeferred ){
117031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* RHS is entirely deferred. So we assume it matches every row.
117032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Advance the LHS iterator to find the next row visited. */
117033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pLeft, pRc);
117034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->iDocid = pLeft->iDocid;
117035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->bEof = pLeft->bEof;
117036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
117037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Neither the RHS or LHS are deferred. */
117038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pLeft, pRc);
117039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pRight, pRc);
117040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( !pLeft->bEof && !pRight->bEof && *pRc==SQLITE_OK ){
117041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iDiff = DOCID_CMP(pLeft->iDocid, pRight->iDocid);
117042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iDiff==0 ) break;
117043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iDiff<0 ){
117044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pLeft, pRc);
117045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
117046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pRight, pRc);
117047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->iDocid = pLeft->iDocid;
117050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->bEof = (pLeft->bEof || pRight->bEof);
117051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
117053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case FTSQUERY_OR: {
117056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pLeft = pExpr->pLeft;
117057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pRight = pExpr->pRight;
117058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iCmp = DOCID_CMP(pLeft->iDocid, pRight->iDocid);
117059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pLeft->bStart || pLeft->iDocid==pRight->iDocid );
117061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pRight->bStart || pLeft->iDocid==pRight->iDocid );
117062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pRight->bEof || (pLeft->bEof==0 && iCmp<0) ){
117064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pLeft, pRc);
117065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( pLeft->bEof || (pRight->bEof==0 && iCmp>0) ){
117066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pRight, pRc);
117067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
117068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pLeft, pRc);
117069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pRight, pRc);
117070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->bEof = (pLeft->bEof && pRight->bEof);
117073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iCmp = DOCID_CMP(pLeft->iDocid, pRight->iDocid);
117074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pRight->bEof || (pLeft->bEof==0 && iCmp<0) ){
117075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->iDocid = pLeft->iDocid;
117076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
117077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->iDocid = pRight->iDocid;
117078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
117081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case FTSQUERY_NOT: {
117084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pLeft = pExpr->pLeft;
117085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pRight = pExpr->pRight;
117086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pRight->bStart==0 ){
117088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pRight, pRc);
117089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( *pRc!=SQLITE_OK || pRight->bStart );
117090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pLeft, pRc);
117093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pLeft->bEof==0 ){
117094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( !*pRc
117095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && !pRight->bEof
117096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && DOCID_CMP(pLeft->iDocid, pRight->iDocid)>0
117097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
117098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pRight, pRc);
117099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->iDocid = pLeft->iDocid;
117102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->bEof = pLeft->bEof;
117103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
117104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default: {
117107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *pPhrase = pExpr->pPhrase;
117108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalInvalidatePoslist(pPhrase);
117109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRc = fts3EvalPhraseNext(pCsr, pPhrase, &pExpr->bEof);
117110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->iDocid = pPhrase->doclist.iDocid;
117111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
117112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
117118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If *pRc is not SQLITE_OK, or if pExpr is not the root node of a NEAR
117119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** cluster, then this function returns 1 immediately.
117120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Otherwise, it checks if the current row really does match the NEAR
117122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expression, using the data currently stored in the position lists
117123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (Fts3Expr->pPhrase.doclist.pList/nList) for each phrase in the expression.
117124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the current row is a match, the position list associated with each
117126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** phrase in the NEAR expression is edited in place to contain only those
117127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** phrase instances sufficiently close to their peers to satisfy all NEAR
117128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** constraints. In this case it returns 1. If the NEAR expression does not
117129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** match the current row, 0 is returned. The position lists may or may not
117130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be edited if 0 is returned.
117131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalNearTest(Fts3Expr *pExpr, int *pRc){
117133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int res = 1;
117134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The following block runs if pExpr is the root of a NEAR query.
117136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** For example, the query:
117137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "w" NEAR "x" NEAR "y" NEAR "z"
117139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** which is represented in tree form as:
117141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** |
117143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** +--NEAR--+ <-- root of NEAR query
117144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** | |
117145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** +--NEAR--+ "z"
117146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** | |
117147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** +--NEAR--+ "y"
117148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** | |
117149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "w" "x"
117150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The right-hand child of a NEAR node is always a phrase. The
117152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** left-hand child may be either a phrase or a NEAR node. There are
117153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** no exceptions to this - it's the way the parser in fts3_expr.c works.
117154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *pRc==SQLITE_OK
117156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && pExpr->eType==FTSQUERY_NEAR
117157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && pExpr->bEof==0
117158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR)
117159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
117160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *p;
117161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nTmp = 0; /* Bytes of temp space */
117162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aTmp; /* Temp space for PoslistNearMerge() */
117163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Allocate temporary working space. */
117165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(p=pExpr; p->pLeft; p=p->pLeft){
117166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nTmp += p->pRight->pPhrase->doclist.nList;
117167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nTmp += p->pPhrase->doclist.nList;
117169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aTmp = sqlite3_malloc(nTmp*2);
117170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !aTmp ){
117171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRc = SQLITE_NOMEM;
117172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ res = 0;
117173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
117174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *aPoslist = p->pPhrase->doclist.pList;
117175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nToken = p->pPhrase->nToken;
117176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(p=p->pParent;res && p && p->eType==FTSQUERY_NEAR; p=p->pParent){
117178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *pPhrase = p->pRight->pPhrase;
117179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nNear = p->nNear;
117180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase);
117181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aPoslist = pExpr->pRight->pPhrase->doclist.pList;
117184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nToken = pExpr->pRight->pPhrase->nToken;
117185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(p=pExpr->pLeft; p && res; p=p->pLeft){
117186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nNear = p->pParent->nNear;
117187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *pPhrase = (
117188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eType==FTSQUERY_NEAR ? p->pRight->pPhrase : p->pPhrase
117189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
117190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ res = fts3EvalNearTrim(nNear, aTmp, &aPoslist, &nToken, pPhrase);
117191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(aTmp);
117195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return res;
117198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
117201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is a helper function for fts3EvalTestDeferredAndNear().
117202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Assuming no error occurs or has occurred, It returns non-zero if the
117203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expression passed as the second argument matches the row that pCsr
117204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** currently points to, or zero if it does not.
117205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If *pRc is not SQLITE_OK when this function is called, it is a no-op.
117207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If an error occurs during execution of this function, *pRc is set to
117208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the appropriate SQLite error code. In this case the returned value is
117209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** undefined.
117210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalTestExpr(
117212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *pCsr, /* FTS cursor handle */
117213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pExpr, /* Expr to test. May or may not be root. */
117214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pRc /* IN/OUT: Error code */
117215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
117216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bHit = 1; /* Return value */
117217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *pRc==SQLITE_OK ){
117218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ switch( pExpr->eType ){
117219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case FTSQUERY_NEAR:
117220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case FTSQUERY_AND:
117221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bHit = (
117222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc)
117223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && fts3EvalTestExpr(pCsr, pExpr->pRight, pRc)
117224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && fts3EvalNearTest(pExpr, pRc)
117225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
117226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If the NEAR expression does not match any rows, zero the doclist for
117228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** all phrases involved in the NEAR. This is because the snippet(),
117229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** offsets() and matchinfo() functions are not supposed to recognize
117230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** any instances of phrases that are part of unmatched NEAR queries.
117231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** For example if this expression:
117232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** ... MATCH 'a OR (b NEAR c)'
117234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is matched against a row containing:
117236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 'a b d e'
117238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** then any snippet() should ony highlight the "a" term, not the "b"
117240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (as "b" is part of a non-matching NEAR clause).
117241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bHit==0
117243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && pExpr->eType==FTSQUERY_NEAR
117244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (pExpr->pParent==0 || pExpr->pParent->eType!=FTSQUERY_NEAR)
117245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
117246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *p;
117247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(p=pExpr; p->pPhrase==0; p=p->pLeft){
117248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->pRight->iDocid==pCsr->iPrevId ){
117249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalInvalidatePoslist(p->pRight->pPhrase);
117250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->iDocid==pCsr->iPrevId ){
117253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalInvalidatePoslist(p->pPhrase);
117254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
117258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case FTSQUERY_OR: {
117260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bHit1 = fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc);
117261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bHit2 = fts3EvalTestExpr(pCsr, pExpr->pRight, pRc);
117262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bHit = bHit1 || bHit2;
117263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
117264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ case FTSQUERY_NOT:
117267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bHit = (
117268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalTestExpr(pCsr, pExpr->pLeft, pRc)
117269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && !fts3EvalTestExpr(pCsr, pExpr->pRight, pRc)
117270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
117271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
117272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ default: {
117274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pCsr->pDeferred
117275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (pExpr->iDocid==pCsr->iPrevId || pExpr->bDeferred)
117276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
117277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *pPhrase = pExpr->pPhrase;
117278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pExpr->bDeferred || pPhrase->doclist.bFreeList==0 );
117279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr->bDeferred ){
117280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalInvalidatePoslist(pPhrase);
117281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRc = fts3EvalDeferredPhrase(pCsr, pPhrase);
117283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bHit = (pPhrase->doclist.pList!=0);
117284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->iDocid = pCsr->iPrevId;
117285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
117286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bHit = (pExpr->bEof==0 && pExpr->iDocid==pCsr->iPrevId);
117287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
117289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return bHit;
117293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
117296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called as the second part of each xNext operation when
117297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** iterating through the results of a full-text query. At this point the
117298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** cursor points to a row that matches the query expression, with the
117299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** following caveats:
117300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Up until this point, "NEAR" operators in the expression have been
117302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** treated as "AND".
117303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * Deferred tokens have not yet been considered.
117305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If *pRc is not SQLITE_OK when this function is called, it immediately
117307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** returns 0. Otherwise, it tests whether or not after considering NEAR
117308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** operators and deferred tokens the current row is still a match for the
117309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expression. It returns 1 if both of the following are true:
117310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1. *pRc is SQLITE_OK when this function returns, and
117312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2. After scanning the current FTS table row for the deferred tokens,
117314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** it is determined that the row does *not* match the query.
117315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Or, if no error occurs and it seems the current row does match the FTS
117317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** query, return 0.
117318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalTestDeferredAndNear(Fts3Cursor *pCsr, int *pRc){
117320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = *pRc;
117321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bMiss = 0;
117322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
117323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If there are one or more deferred tokens, load the current row into
117325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** memory and scan it to determine the position list for each deferred
117326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** token. Then, see if this row is really a match, considering deferred
117327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** tokens and NEAR operators (neither of which were taken into account
117328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** earlier, by fts3EvalNextRow()).
117329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pCsr->pDeferred ){
117331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3CursorSeek(0, pCsr);
117332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
117333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3CacheDeferredDoclists(pCsr);
117334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bMiss = (0==fts3EvalTestExpr(pCsr, pCsr->pExpr, &rc));
117337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Free the position-lists accumulated for each deferred token above. */
117339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Fts3FreeDeferredDoclists(pCsr);
117340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRc = rc;
117341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (rc==SQLITE_OK && bMiss);
117343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
117346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Advance to the next document that matches the FTS expression in
117347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fts3Cursor.pExpr.
117348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalNext(Fts3Cursor *pCsr){
117350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Return Code */
117351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pExpr = pCsr->pExpr;
117352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pCsr->isEof==0 );
117353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr==0 ){
117354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->isEof = 1;
117355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
117356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ do {
117357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pCsr->isRequireSeek==0 ){
117358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_reset(pCsr->pStmt);
117359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( sqlite3_data_count(pCsr->pStmt)==0 );
117361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pExpr, &rc);
117362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->isEof = pExpr->bEof;
117363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->isRequireSeek = 1;
117364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->isMatchinfoNeeded = 1;
117365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->iPrevId = pExpr->iDocid;
117366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }while( pCsr->isEof==0 && fts3EvalTestDeferredAndNear(pCsr, &rc) );
117367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
117369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
117372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Restart interation for expression pExpr so that the next call to
117373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** fts3EvalNext() visits the first row. Do not allow incremental
117374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** loading or merging of phrase doclists for this iteration.
117375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If *pRc is other than SQLITE_OK when this function is called, it is
117377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a no-op. If an error occurs within this function, *pRc is set to an
117378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLite error code before returning.
117379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3EvalRestart(
117381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *pCsr,
117382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pExpr,
117383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pRc
117384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
117385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr && *pRc==SQLITE_OK ){
117386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *pPhrase = pExpr->pPhrase;
117387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117388 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPhrase ){
117389 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalInvalidatePoslist(pPhrase);
117390 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPhrase->bIncr ){
117391 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPhrase->nToken==1 );
117392 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPhrase->aToken[0].pSegcsr );
117393 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Fts3MsrIncrRestart(pPhrase->aToken[0].pSegcsr);
117394 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pRc = fts3EvalPhraseStart(pCsr, 0, pPhrase);
117395 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.pNextDocid = 0;
117398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->doclist.iDocid = 0;
117399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->iDocid = 0;
117402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->bEof = 0;
117403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->bStart = 0;
117404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalRestart(pCsr, pExpr->pLeft, pRc);
117406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalRestart(pCsr, pExpr->pRight, pRc);
117407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
117411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** After allocating the Fts3Expr.aMI[] array for each phrase in the
117412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expression rooted at pExpr, the cursor iterates through all rows matched
117413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** by pExpr, calling this function for each row. This function increments
117414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the values in Fts3Expr.aMI[] according to the position-list currently
117415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** found in Fts3Expr.pPhrase->doclist.pList for each of the phrase
117416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expression nodes.
117417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3EvalUpdateCounts(Fts3Expr *pExpr){
117419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr ){
117420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *pPhrase = pExpr->pPhrase;
117421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPhrase && pPhrase->doclist.pList ){
117422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iCol = 0;
117423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *p = pPhrase->doclist.pList;
117424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( *p );
117426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( 1 ){
117427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 c = 0;
117428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iCnt = 0;
117429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( 0xFE & (*p | c) ){
117430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (c&0x80)==0 ) iCnt++;
117431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ c = *p++ & 0x80;
117432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* aMI[iCol*3 + 1] = Number of occurrences
117435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** aMI[iCol*3 + 2] = Number of rows containing at least one instance
117436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->aMI[iCol*3 + 1] += iCnt;
117438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pExpr->aMI[iCol*3 + 2] += (iCnt>0);
117439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *p==0x00 ) break;
117440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p++;
117441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p += sqlite3Fts3GetVarint32(p, &iCol);
117442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalUpdateCounts(pExpr->pLeft);
117446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalUpdateCounts(pExpr->pRight);
117447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
117451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Expression pExpr must be of type FTSQUERY_PHRASE.
117452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If it is not already allocated and populated, this function allocates and
117454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** populates the Fts3Expr.aMI[] array for expression pExpr. If pExpr is part
117455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of a NEAR expression, then it also allocates and populates the same array
117456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for all other phrases that are part of the NEAR expression.
117457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SQLITE_OK is returned if the aMI[] array is successfully allocated and
117459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** populated. Otherwise, if an error occurs, an SQLite error code is returned.
117460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3EvalGatherStats(
117462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *pCsr, /* Cursor object */
117463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pExpr /* FTSQUERY_PHRASE expression */
117464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
117465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK; /* Return code */
117466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pExpr->eType==FTSQUERY_PHRASE );
117468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr->aMI==0 ){
117469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
117470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pRoot; /* Root of NEAR expression */
117471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *p; /* Iterator used for several purposes */
117472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iPrevId = pCsr->iPrevId;
117474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iDocid;
117475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 bEof;
117476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Find the root of the NEAR expression */
117478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRoot = pExpr;
117479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pRoot->pParent && pRoot->pParent->eType==FTSQUERY_NEAR ){
117480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRoot = pRoot->pParent;
117481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iDocid = pRoot->iDocid;
117483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bEof = pRoot->bEof;
117484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pRoot->bStart );
117485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Allocate space for the aMSI[] array of each FTSQUERY_PHRASE node */
117487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(p=pRoot; p; p=p->pLeft){
117488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pE = (p->eType==FTSQUERY_PHRASE?p:p->pRight);
117489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pE->aMI==0 );
117490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pE->aMI = (u32 *)sqlite3_malloc(pTab->nColumn * 3 * sizeof(u32));
117491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pE->aMI ) return SQLITE_NOMEM;
117492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(pE->aMI, 0, pTab->nColumn * 3 * sizeof(u32));
117493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalRestart(pCsr, pRoot, &rc);
117496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pCsr->isEof==0 && rc==SQLITE_OK ){
117498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ do {
117500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Ensure the %_content statement is reset. */
117501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pCsr->isRequireSeek==0 ) sqlite3_reset(pCsr->pStmt);
117502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( sqlite3_data_count(pCsr->pStmt)==0 );
117503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Advance to the next document */
117505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pRoot, &rc);
117506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->isEof = pRoot->bEof;
117507 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->isRequireSeek = 1;
117508 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->isMatchinfoNeeded = 1;
117509 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->iPrevId = pRoot->iDocid;
117510 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }while( pCsr->isEof==0
117511 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && pRoot->eType==FTSQUERY_NEAR
117512 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && fts3EvalTestDeferredAndNear(pCsr, &rc)
117513 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
117514 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117515 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK && pCsr->isEof==0 ){
117516 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalUpdateCounts(pRoot);
117517 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117518 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117519 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117520 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->isEof = 0;
117521 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->iPrevId = iPrevId;
117522 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bEof ){
117524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRoot->bEof = bEof;
117525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
117526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Caution: pRoot may iterate through docids in ascending or descending
117527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** order. For this reason, even though it seems more defensive, the
117528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** do loop can not be written:
117529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** do {...} while( pRoot->iDocid<iDocid && rc==SQLITE_OK );
117531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalRestart(pCsr, pRoot, &rc);
117533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ do {
117534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalNextRow(pCsr, pRoot, &rc);
117535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pRoot->bEof==0 );
117536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }while( pRoot->iDocid!=iDocid && rc==SQLITE_OK );
117537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalTestDeferredAndNear(pCsr, &rc);
117538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
117541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
117544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is used by the matchinfo() module to query a phrase
117545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** expression node for the following information:
117546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 1. The total number of occurrences of the phrase in each column of
117548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the FTS table (considering all rows), and
117549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 2. For each column, the number of rows in the table for which the
117551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** column contains at least one instance of the phrase.
117552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If no error occurs, SQLITE_OK is returned and the values for each column
117554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** written into the array aiOut as follows:
117555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** aiOut[iCol*3 + 1] = Number of occurrences
117557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** aiOut[iCol*3 + 2] = Number of rows containing at least one instance
117558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Caveats:
117560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * If a phrase consists entirely of deferred tokens, then all output
117562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** values are set to the number of documents in the table. In other
117563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** words we assume that very common tokens occur exactly once in each
117564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** column of each row of the table.
117565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * If a phrase contains some deferred tokens (and some non-deferred
117567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** tokens), count the potential occurrence identified by considering
117568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the non-deferred tokens instead of actual phrase occurrences.
117569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * If the phrase is part of a NEAR expression, then only phrase instances
117571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** that meet the NEAR constraint are included in the counts.
117572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3EvalPhraseStats(
117574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *pCsr, /* FTS cursor handle */
117575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pExpr, /* Phrase expression */
117576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *aiOut /* Array to write results into (see above) */
117577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
117578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
117579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
117580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iCol;
117581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pExpr->bDeferred && pExpr->pParent->eType!=FTSQUERY_NEAR ){
117583 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pCsr->nDoc>0 );
117584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iCol=0; iCol<pTab->nColumn; iCol++){
117585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aiOut[iCol*3 + 1] = (u32)pCsr->nDoc;
117586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aiOut[iCol*3 + 2] = (u32)pCsr->nDoc;
117587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
117589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3EvalGatherStats(pCsr, pExpr);
117590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
117591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pExpr->aMI );
117592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(iCol=0; iCol<pTab->nColumn; iCol++){
117593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aiOut[iCol*3 + 1] = pExpr->aMI[iCol*3 + 1];
117594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aiOut[iCol*3 + 2] = pExpr->aMI[iCol*3 + 2];
117595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
117600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
117603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The expression pExpr passed as the second argument to this function
117604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** must be of type FTSQUERY_PHRASE.
117605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The returned value is either NULL or a pointer to a buffer containing
117607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a position-list indicating the occurrences of the phrase in column iCol
117608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** of the current row.
117609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** More specifically, the returned buffer contains 1 varint for each
117611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** occurence of the phrase in the column, stored using the normal (delta+2)
117612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** compression and is terminated by either an 0x01 or 0x00 byte. For example,
117613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if the requested column contains "a b X c d X X" and the position-list
117614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for 'X' is requested, the buffer returned may contain:
117615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** 0x04 0x05 0x03 0x01 or 0x04 0x05 0x03 0x00
117617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function works regardless of whether or not the phrase is deferred,
117619 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** incremental, or neither.
117620 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117621 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE char *sqlite3Fts3EvalPhrasePoslist(
117622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *pCsr, /* FTS3 cursor object */
117623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Expr *pExpr, /* Phrase to return doclist for */
117624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iCol /* Column to return position list for */
117625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
117626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *pPhrase = pExpr->pPhrase;
117627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *pTab = (Fts3Table *)pCsr->base.pVtab;
117628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pIter = pPhrase->doclist.pList;
117629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iThis;
117630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iCol>=0 && iCol<pTab->nColumn );
117632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pIter
117633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || pExpr->bEof
117634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || pExpr->iDocid!=pCsr->iPrevId
117635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || (pPhrase->iColumn<pTab->nColumn && pPhrase->iColumn!=iCol)
117636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
117637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0;
117638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pPhrase->doclist.nList>0 );
117641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *pIter==0x01 ){
117642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIter++;
117643 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIter += sqlite3Fts3GetVarint32(pIter, &iThis);
117644 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
117645 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iThis = 0;
117646 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( iThis<iCol ){
117648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3ColumnlistCopy(0, &pIter);
117649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( *pIter==0x00 ) return 0;
117650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIter++;
117651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIter += sqlite3Fts3GetVarint32(pIter, &iThis);
117652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return ((iCol==iThis)?pIter:0);
117655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
117658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Free all components of the Fts3Phrase structure that were allocated by
117659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the eval module. Specifically, this means to free:
117660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
117661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * the contents of pPhrase->doclist, and
117662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** * any Fts3MultiSegReader objects held by phrase tokens.
117663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
117664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE void sqlite3Fts3EvalPhraseCleanup(Fts3Phrase *pPhrase){
117665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pPhrase ){
117666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
117667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pPhrase->doclist.aAll);
117668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3EvalInvalidatePoslist(pPhrase);
117669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&pPhrase->doclist, 0, sizeof(Fts3Doclist));
117670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<pPhrase->nToken; i++){
117671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3SegReaderCursorFree(pPhrase->aToken[i].pSegcsr);
117672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pPhrase->aToken[i].pSegcsr = 0;
117673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
117675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
115610 117676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115611 117677 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if !SQLITE_CORE
117678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
117679 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Initialize API pointer table, if required.
117680 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
115612 117681 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_API int sqlite3_extension_init(
115613 117682 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3 *db,
115614 117683 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char **pzErrMsg,
115615 117684 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const sqlite3_api_routines *pApi
115616 117685 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
@@ -115634,11 +117703,10 @@
115634 117703 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** May you share freely, never taking more than you give.
115635 117704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
115636 117705 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
******************************************************************************
115637 117706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
115638 117707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
115639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
115640 117708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
115641 117709 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115642 117710 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115643 117711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct Fts3auxTable Fts3auxTable;
115644 117712 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct Fts3auxCursor Fts3auxCursor;
@@ -115648,11 +117716,11 @@
115648 117716 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *pFts3Tab;
115649 117717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
115650 117718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115651 117719 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct Fts3auxCursor {
115652 117720 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_vtab_cursor base; /* Base class used by SQLite core */
115653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReaderCursor csr; /* Must be right after "base" */
117721 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader csr; /* Must be right after "base" */
115654 117722 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3SegFilter filter;
115655 117723 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zStop;
115656 117724 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nStop; /* Byte-length of string zStop */
115657 117725 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isEof; /* True if cursor is at EOF */
115658 117726 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iRowid; /* Current rowid */
@@ -115716,10 +117784,11 @@
115716 117784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115717 117785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pFts3Tab = (Fts3Table *)&p[1];
115718 117786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pFts3Tab->zDb = (char *)&p->pFts3Tab[1];
115719 117787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pFts3Tab->zName = &p->pFts3Tab->zDb[nDb+1];
115720 117788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pFts3Tab->db = db;
117789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pFts3Tab->nIndex = 1;
115721 117790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
115722 117791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy((char *)p->pFts3Tab->zDb, zDb, nDb);
115723 117792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy((char *)p->pFts3Tab->zName, zFts3, nFts3);
115724 117793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3Dequote((char *)p->pFts3Tab->zName);
115725 117794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -115996,11 +118065,11 @@
115996 118065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->zStop = sqlite3_mprintf("%s", sqlite3_value_text(apVal[iIdx]));
115997 118066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->nStop = sqlite3_value_bytes(apVal[iIdx]);
115998 118067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pCsr->zStop==0 ) return SQLITE_NOMEM;
115999 118068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116000 118069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
116001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3SegReaderCursor(pFts3, FTS3_SEGCURSOR_ALL,
118070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3SegReaderCursor(pFts3, 0, FTS3_SEGCURSOR_ALL,
116002 118071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->filter.zTerm, pCsr->filter.nTerm, 0, isScan, &pCsr->csr
116003 118072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
116004 118073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
116005 118074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3Fts3SegReaderStart(pFts3, &pCsr->csr, &pCsr->filter);
116006 118075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -116175,16 +118244,25 @@
116175 118244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Default span for NEAR operators.
116176 118245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
116177 118246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQLITE_FTS3_DEFAULT_NEAR_PARAM 10
116178 118247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
116179 118248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
118250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** isNot:
118251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This variable is used by function getNextNode(). When getNextNode() is
118252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** called, it sets ParseContext.isNot to true if the 'next node' is a
118253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** FTSQUERY_PHRASE with a unary "-" attached to it. i.e. "mysql" in the
118254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** FTS3 query "sqlite -mysql". Otherwise, ParseContext.isNot is set to
118255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** zero.
118256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116180 118257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct ParseContext ParseContext;
116181 118258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct ParseContext {
116182 118259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_tokenizer *pTokenizer; /* Tokenizer module */
116183 118260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char **azCol; /* Array of column names for fts3 table */
116184 118261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nCol; /* Number of entries in azCol[] */
116185 118262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iDefaultCol; /* Default column to query */
118263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int isNot; /* True if getNextNode() sees a unary - */
116186 118264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_context *pCtx; /* Write error message here */
116187 118265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nNest; /* Number of nested brackets */
116188 118266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
116189 118267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
116190 118268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -116266,11 +118344,11 @@
116266 118344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iEnd<n && z[iEnd]=='*' ){
116267 118345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pRet->pPhrase->aToken[0].isPrefix = 1;
116268 118346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iEnd++;
116269 118347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116270 118348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !sqlite3_fts3_enable_parentheses && iStart>0 && z[iStart-1]=='-' ){
116271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pRet->pPhrase->isNot = 1;
118349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pParse->isNot = 1;
116272 118350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116273 118351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116274 118352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nConsumed = iEnd;
116275 118353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116276 118354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -116318,71 +118396,86 @@
116318 118396 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Expr *p = 0;
116319 118397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_tokenizer_cursor *pCursor = 0;
116320 118398 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zTemp = 0;
116321 118399 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nTemp = 0;
116322 118400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const int nSpace = sizeof(Fts3Expr) + sizeof(Fts3Phrase);
118402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nToken = 0;
118403 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The final Fts3Expr data structure, including the Fts3Phrase,
118405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fts3PhraseToken structures token buffers are all stored as a single
118406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** allocation so that the expression can be freed with a single call to
118407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3_free(). Setting this up requires a two pass approach.
118408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
118409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The first pass, in the block below, uses a tokenizer cursor to iterate
118410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** through the tokens in the expression. This pass uses fts3ReallocOrFree()
118411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** to assemble data in two dynamic buffers:
118412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
118413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Buffer p: Points to the Fts3Expr structure, followed by the Fts3Phrase
118414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** structure, followed by the array of Fts3PhraseToken
118415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** structures. This pass only populates the Fts3PhraseToken array.
118416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
118417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Buffer zTemp: Contains copies of all tokens.
118418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
118419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The second pass, in the block that begins "if( rc==SQLITE_DONE )" below,
118420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** appends buffer zTemp to buffer p, and fills in the Fts3Expr and Fts3Phrase
118421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** structures.
118422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
116323 118423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = pModule->xOpen(pTokenizer, zInput, nInput, &pCursor);
116324 118424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
116325 118425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int ii;
116326 118426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCursor->pTokenizer = pTokenizer;
116327 118427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(ii=0; rc==SQLITE_OK; ii++){
116328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zToken;
116329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nToken, iBegin, iEnd, iPos;
116330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = pModule->xNext(pCursor, &zToken, &nToken, &iBegin, &iEnd, &iPos);
118428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zByte;
118429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nByte, iBegin, iEnd, iPos;
118430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pModule->xNext(pCursor, &zByte, &nByte, &iBegin, &iEnd, &iPos);
116331 118431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
116332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase);
116333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p = fts3ReallocOrFree(p, nByte+ii*sizeof(Fts3PhraseToken));
116334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zTemp = fts3ReallocOrFree(zTemp, nTemp + nToken);
116335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !p || !zTemp ){
116336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto no_mem;
116337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
116338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ii==0 ){
116339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(p, 0, nByte);
116340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pPhrase = (Fts3Phrase *)&p[1];
116341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
116342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pPhrase = (Fts3Phrase *)&p[1];
116343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(&p->pPhrase->aToken[ii], 0, sizeof(Fts3PhraseToken));
116344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pPhrase->nToken = ii+1;
116345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pPhrase->aToken[ii].n = nToken;
116346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memcpy(&zTemp[nTemp], zToken, nToken);
116347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nTemp += nToken;
116348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iEnd<nInput && zInput[iEnd]=='*' ){
116349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pPhrase->aToken[ii].isPrefix = 1;
116350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
116351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pPhrase->aToken[ii].isPrefix = 0;
116352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
118432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3PhraseToken *pToken;
118433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p = fts3ReallocOrFree(p, nSpace + ii*sizeof(Fts3PhraseToken));
118435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !p ) goto no_mem;
118436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zTemp = fts3ReallocOrFree(zTemp, nTemp + nByte);
118438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !zTemp ) goto no_mem;
118439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( nToken==ii );
118441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pToken = &((Fts3Phrase *)(&p[1]))->aToken[ii];
118442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(pToken, 0, sizeof(Fts3PhraseToken));
118443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(&zTemp[nTemp], zByte, nByte);
118445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nTemp += nByte;
118446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pToken->n = nByte;
118448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pToken->isPrefix = (iEnd<nInput && zInput[iEnd]=='*');
118449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nToken = ii+1;
116353 118450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116354 118451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116355 118452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
116356 118453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pModule->xClose(pCursor);
116357 118454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCursor = 0;
116358 118455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116359 118456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
116360 118457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_DONE ){
116361 118458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int jj;
116362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *zNew = NULL;
116363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nNew = 0;
116364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nByte = sizeof(Fts3Expr) + sizeof(Fts3Phrase);
116365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nByte += (p?(p->pPhrase->nToken-1):0) * sizeof(Fts3PhraseToken);
116366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p = fts3ReallocOrFree(p, nByte + nTemp);
116367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( !p ){
116368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- goto no_mem;
116369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
116370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( zTemp ){
116371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- zNew = &(((char *)p)[nByte]);
116372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memcpy(zNew, zTemp, nTemp);
116373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
116374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- memset(p, 0, nByte+nTemp);
116375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
118459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *zBuf = 0;
118460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p = fts3ReallocOrFree(p, nSpace + nToken*sizeof(Fts3PhraseToken) + nTemp);
118462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !p ) goto no_mem;
118463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(p, 0, (char *)&(((Fts3Phrase *)&p[1])->aToken[0])-(char *)p);
118464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->eType = FTSQUERY_PHRASE;
116376 118465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pPhrase = (Fts3Phrase *)&p[1];
118466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pPhrase->iColumn = pParse->iDefaultCol;
118467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pPhrase->nToken = nToken;
118468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zBuf = (char *)&p->pPhrase->aToken[nToken];
118470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(zBuf, zTemp, nTemp);
118471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(zTemp);
118472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
116377 118473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(jj=0; jj<p->pPhrase->nToken; jj++){
116378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pPhrase->aToken[jj].z = &zNew[nNew];
116379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nNew += p->pPhrase->aToken[jj].n;
118474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pPhrase->aToken[jj].z = zBuf;
118475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ zBuf += p->pPhrase->aToken[jj].n;
116380 118476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(zTemp);
116382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->eType = FTSQUERY_PHRASE;
116383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->pPhrase->iColumn = pParse->iDefaultCol;
116384 118477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_OK;
116385 118478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116386 118479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
116387 118480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*ppExpr = p;
116388 118481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
@@ -116434,10 +118527,12 @@
116434 118527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc;
116435 118528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Expr *pRet = 0;
116436 118529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
116437 118530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zInput = z;
116438 118531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nInput = n;
118532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pParse->isNot = 0;
116439 118534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
116440 118535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Skip over any whitespace before checking for a keyword, an open or
116441 118536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** close bracket, or a quoted string.
116442 118537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
116443 118538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( nInput>0 && fts3isspace(*zInput) ){
@@ -116653,11 +118748,11 @@
116653 118748 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = getNextNode(pParse, zIn, nIn, &p, &nByte);
116654 118749 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
116655 118750 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isPhrase;
116656 118751 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
116657 118752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !sqlite3_fts3_enable_parentheses
116658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && p->eType==FTSQUERY_PHRASE && p->pPhrase->isNot
118753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && p->eType==FTSQUERY_PHRASE && pParse->isNot
116659 118754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
116660 118755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Create an implicit NOT operator. */
116661 118756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Expr *pNot = fts3MallocZero(sizeof(Fts3Expr));
116662 118757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !pNot ){
116663 118758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3ExprFree(p);
@@ -116671,11 +118766,10 @@
116671 118766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116672 118767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNotBranch = pNot;
116673 118768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p = pPrev;
116674 118769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
116675 118770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int eType = p->eType;
116676 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( eType!=FTSQUERY_PHRASE || !p->pPhrase->isNot );
116677 118771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
isPhrase = (eType==FTSQUERY_PHRASE || p->pLeft);
116678 118772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
116679 118773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The isRequirePhrase variable is set to true if a phrase or
116680 118774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** an expression contained in parenthesis is required. If a
116681 118775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** binary operator (AND, OR, NOT or NEAR) is encounted when
@@ -116834,13 +118928,15 @@
116834 118928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
116835 118929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Free a parsed fts3 query expression allocated by sqlite3Fts3ExprParse().
116836 118930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
116837 118931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Fts3ExprFree(Fts3Expr *p){
116838 118932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p ){
118933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p->eType==FTSQUERY_PHRASE || p->pPhrase==0 );
116839 118934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3ExprFree(p->pLeft);
116840 118935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3ExprFree(p->pRight);
116841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(p->aDoclist);
118936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Fts3EvalPhraseCleanup(p->pPhrase);
118937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(p->aMI);
116842 118938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(p);
116843 118939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116844 118940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
116845 118941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
116846 118942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/****************************************************************************
@@ -116893,11 +118989,11 @@
116893 118989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
switch( pExpr->eType ){
116894 118990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case FTSQUERY_PHRASE: {
116895 118991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Phrase *pPhrase = pExpr->pPhrase;
116896 118992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
116897 118993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zBuf = sqlite3_mprintf(
116898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "%zPHRASE %d %d", zBuf, pPhrase->iColumn, pPhrase->isNot);
118994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "%zPHRASE %d 0", zBuf, pPhrase->iColumn);
116899 118995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; zBuf && i<pPhrase->nToken; i++){
116900 118996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zBuf = sqlite3_mprintf("%z %.*s%s", zBuf,
116901 118997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPhrase->aToken[i].n, pPhrase->aToken[i].z,
116902 118998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(pPhrase->aToken[i].isPrefix?"+":"")
116903 118999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
@@ -117437,11 +119533,10 @@
117437 119533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
117438 119534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** * The FTS3 module is being built into the core of
117439 119535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SQLite (in which case SQLITE_ENABLE_FTS3 is defined).
117440 119536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
117441 119537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
117442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
117443 119538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
117444 119539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
117445 119540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
117446 119541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
117447 119542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Class derived from sqlite3_tokenizer
@@ -118082,14 +120177,10 @@
118082 120177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** * The FTS3 module is being built into the core of
118083 120178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SQLite (in which case SQLITE_ENABLE_FTS3 is defined).
118084 120179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
118085 120180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
118086 120181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #ifndef SQLITE_CORE
118088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_EXTENSION_INIT1
118089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #endif
118090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
118091 120182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118092 120183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
118093 120184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Implementation of the SQL scalar function for accessing the underlying
118094 120185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** hash table. This function may be called as follows:
118095 120186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
@@ -118209,11 +120300,11 @@
118209 120300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_tokenizer **ppTok, /* OUT: Tokenizer (if applicable) */
118210 120301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char **pzErr /* OUT: Set to malloced error message */
118211 120302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
118212 120303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc;
118213 120304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *z = (char *)zArg;
118214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n;
120305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = 0;
118215 120306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zCopy;
118216 120307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zEnd; /* Pointer to nul-term of zCopy */
118217 120308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_tokenizer_module *m;
118218 120309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118219 120310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zCopy = sqlite3_mprintf("%s", zArg);
@@ -118574,11 +120665,10 @@
118574 120665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
118575 120666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
118576 120667 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118577 120668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118578 120669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
118580 120670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct simple_tokenizer {
118581 120671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_tokenizer base;
118582 120672 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char delim[128]; /* flag ASCII delimiters */
118583 120673 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
} simple_tokenizer;
118584 120674 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -118811,18 +120901,44 @@
118811 120901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** it is always safe to read up to two varints from it without risking an
118812 120902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** overread, even if the node data is corrupted.
118813 120903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
118814 120904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define FTS3_NODE_PADDING (FTS3_VARINT_MAX*2)
118815 120905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
120907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Under certain circumstances, b-tree nodes (doclists) can be loaded into
120908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** memory incrementally instead of all at once. This can be a big performance
120909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** win (reduced IO and CPU) if SQLite stops calling the virtual table xNext()
120910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** method before retrieving all query results (as may happen, for example,
120911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** if a query has a LIMIT clause).
120912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
120913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Incremental loading is used for b-tree nodes FTS3_NODE_CHUNK_THRESHOLD
120914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** bytes and larger. Nodes are loaded in chunks of FTS3_NODE_CHUNKSIZE bytes.
120915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** The code is written so that the hard lower-limit for each of these values
120916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** is 1. Clearly such small values would be inefficient, but can be useful
120917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** for testing purposes.
120918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
120919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If this module is built with SQLITE_TEST defined, these constants may
120920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** be overridden at runtime for testing purposes. File fts3_test.c contains
120921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a Tcl interface to read and write the values.
120922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
120923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #ifdef SQLITE_TEST
120924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int test_fts3_node_chunksize = (4*1024);
120925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int test_fts3_node_chunk_threshold = (4*1024)*4;
120926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define FTS3_NODE_CHUNKSIZE test_fts3_node_chunksize
120927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define FTS3_NODE_CHUNK_THRESHOLD test_fts3_node_chunk_threshold
120928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #else
120929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define FTS3_NODE_CHUNKSIZE (4*1024)
120930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # define FTS3_NODE_CHUNK_THRESHOLD (FTS3_NODE_CHUNKSIZE*4)
120931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #endif
120932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118816 120933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct PendingList PendingList;
118817 120934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct SegmentNode SegmentNode;
118818 120935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct SegmentWriter SegmentWriter;
118819 120936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118820 120937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
118821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Data structure used while accumulating terms in the pending-terms hash
118822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** table. The hash table entry maps from term (a string) to a malloc'd
118823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** instance of this structure.
120938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** An instance of the following data structure is used to build doclists
120939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** incrementally. See function fts3PendingListAppend() for details.
118824 120940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
118825 120941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct PendingList {
118826 120942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nData;
118827 120943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aData;
118828 120944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nSpace;
@@ -118849,11 +120965,10 @@
118849 120965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of type Fts3SegReader* are also used by code in fts3.c to iterate through
118850 120966 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** terms when querying the full-text index. See functions:
118851 120967 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
118852 120968 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3Fts3SegReaderNew()
118853 120969 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3Fts3SegReaderFree()
118854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** sqlite3Fts3SegReaderCost()
118855 120970 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** sqlite3Fts3SegReaderIterate()
118856 120971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
118857 120972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Methods used to manipulate Fts3SegReader structures:
118858 120973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
118859 120974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** fts3SegReaderNext()
@@ -118868,10 +120983,13 @@
118868 120983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iEndBlock; /* Rowid of final block in segment (or 0) */
118869 120984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iCurrentBlock; /* Current leaf block (or 0) */
118870 120985 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118871 120986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aNode; /* Pointer to node data (or NULL) */
118872 120987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nNode; /* Size of buffer at aNode (or 0) */
120988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nPopulate; /* If >0, bytes of buffer aNode[] loaded */
120989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_blob *pBlob; /* If not NULL, blob handle to read node */
120990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
118873 120991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3HashElem **ppNextElem;
118874 120992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118875 120993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Variables set by fts3SegReaderNext(). These may be read directly
118876 120994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** by the caller. They are valid from the time SegmentReaderNew() returns
118877 120995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** until SegmentReaderNext() returns something other than SQLITE_OK
@@ -118881,12 +120999,15 @@
118881 120999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zTerm; /* Pointer to current term */
118882 121000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nTermAlloc; /* Allocated size of zTerm buffer */
118883 121001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aDoclist; /* Pointer to doclist of current entry */
118884 121002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nDoclist; /* Size of doclist in current entry */
118885 121003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* The following variables are used to iterate through the current doclist */
121004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The following variables are used by fts3SegReaderNextDocid() to iterate
121005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** through the current doclist (aDoclist/nDoclist).
121006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
118887 121007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *pOffsetList;
121008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nOffsetList; /* For descending pending seg-readers only */
118888 121009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iDocid;
118889 121010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
118890 121011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118891 121012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define fts3SegReaderIsPending(p) ((p)->ppNextElem!=0)
118892 121013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define fts3SegReaderIsRootOnly(p) ((p)->aNode==(char *)&(p)[1])
@@ -118920,10 +121041,18 @@
118920 121041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** within the fts3SegWriterXXX() family of functions described above.
118921 121042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
118922 121043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** fts3NodeAddTerm()
118923 121044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** fts3NodeWrite()
118924 121045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** fts3NodeFree()
121046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
121047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** When a b+tree is written to the database (either as a result of a merge
121048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** or the pending-terms table being flushed), leaves are written into the
121049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** database file as soon as they are completely populated. The interior of
121050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the tree is assembled in memory and written out only once all leaves have
121051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** been populated and stored. This is Ok, as the b+-tree fanout is usually
121052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** very large, meaning that the interior of the tree consumes relatively
121053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** little memory.
118925 121054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
118926 121055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct SegmentNode {
118927 121056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SegmentNode *pParent; /* Parent node (or NULL for root node) */
118928 121057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SegmentNode *pRight; /* Pointer to right-sibling */
118929 121058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SegmentNode *pLeftmost; /* Pointer to left-most node of this depth */
@@ -118950,21 +121079,26 @@
118950 121079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQL_NEXT_SEGMENT_INDEX 8
118951 121080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQL_INSERT_SEGMENTS 9
118952 121081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQL_NEXT_SEGMENTS_ID 10
118953 121082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQL_INSERT_SEGDIR 11
118954 121083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQL_SELECT_LEVEL 12
118955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQL_SELECT_ALL_LEVEL 13
121084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQL_SELECT_LEVEL_RANGE 13
118956 121085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQL_SELECT_LEVEL_COUNT 14
118957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQL_SELECT_SEGDIR_COUNT_MAX 15
118958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #define SQL_DELETE_SEGDIR_BY_LEVEL 16
121086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQL_SELECT_SEGDIR_MAX_LEVEL 15
121087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQL_DELETE_SEGDIR_LEVEL 16
118959 121088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQL_DELETE_SEGMENTS_RANGE 17
118960 121089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQL_CONTENT_INSERT 18
118961 121090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQL_DELETE_DOCSIZE 19
118962 121091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQL_REPLACE_DOCSIZE 20
118963 121092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQL_SELECT_DOCSIZE 21
118964 121093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQL_SELECT_DOCTOTAL 22
118965 121094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#define SQL_REPLACE_DOCTOTAL 23
121095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQL_SELECT_ALL_PREFIX_LEVEL 24
121097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQL_DELETE_ALL_TERMS_SEGDIR 25
121098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ #define SQL_DELETE_SEGDIR_RANGE 26
118966 121100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118967 121101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
118968 121102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function is used to obtain an SQLite prepared statement handle
118969 121103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** for the statement identified by the second argument. If successful,
118970 121104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** *pp is set to the requested statement handle and SQLITE_OK returned.
@@ -118997,23 +121131,29 @@
118997 121131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
118998 121132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Return segments in order from oldest to newest.*/
118999 121133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 12 */ "SELECT idx, start_block, leaves_end_block, end_block, root "
119000 121134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
"FROM %Q.'%q_segdir' WHERE level = ? ORDER BY idx ASC",
119001 121135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 13 */ "SELECT idx, start_block, leaves_end_block, end_block, root "
119002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- "FROM %Q.'%q_segdir' ORDER BY level DESC, idx ASC",
121136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?"
121137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ "ORDER BY level DESC, idx ASC",
119003 121138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119004 121139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 14 */ "SELECT count(*) FROM %Q.'%q_segdir' WHERE level = ?",
119005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* 15 */ "SELECT count(*), max(level) FROM %Q.'%q_segdir'",
121140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 15 */ "SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?",
119006 121141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119007 121142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 16 */ "DELETE FROM %Q.'%q_segdir' WHERE level = ?",
119008 121143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 17 */ "DELETE FROM %Q.'%q_segments' WHERE blockid BETWEEN ? AND ?",
119009 121144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 18 */ "INSERT INTO %Q.'%q_content' VALUES(%s)",
119010 121145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 19 */ "DELETE FROM %Q.'%q_docsize' WHERE docid = ?",
119011 121146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 20 */ "REPLACE INTO %Q.'%q_docsize' VALUES(?,?)",
119012 121147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 21 */ "SELECT size FROM %Q.'%q_docsize' WHERE docid=?",
119013 121148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 22 */ "SELECT value FROM %Q.'%q_stat' WHERE id=0",
119014 121149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* 23 */ "REPLACE INTO %Q.'%q_stat' VALUES(0,?)",
121150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 24 */ "",
121151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 25 */ "",
121152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* 26 */ "DELETE FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?",
121154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
119015 121155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
119016 121156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
119017 121157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_stmt *pStmt;
119018 121158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119019 121159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( SizeofArray(azSql)==SizeofArray(p->aStmt) );
@@ -119165,18 +121305,36 @@
119165 121305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 1: start_block
119166 121306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 2: leaves_end_block
119167 121307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 3: end_block
119168 121308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** 4: root
119169 121309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
119170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3AllSegdirs(Fts3Table *p, int iLevel, sqlite3_stmt **ppStmt){
121310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3AllSegdirs(
121311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *p, /* FTS3 table */
121312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iIndex, /* Index for p->aIndex[] */
121313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iLevel, /* Level to select */
121314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_stmt **ppStmt /* OUT: Compiled statement */
121315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
119171 121316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc;
119172 121317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_stmt *pStmt = 0;
121318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iLevel==FTS3_SEGCURSOR_ALL || iLevel>=0 );
121320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iLevel<FTS3_SEGDIR_MAXLEVEL );
121321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iIndex>=0 && iIndex<p->nIndex );
121322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
119173 121323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iLevel<0 ){
119174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3SqlStmt(p, SQL_SELECT_ALL_LEVEL, &pStmt, 0);
121324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* "SELECT * FROM %_segdir WHERE level BETWEEN ? AND ? ORDER BY ..." */
121325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SqlStmt(p, SQL_SELECT_LEVEL_RANGE, &pStmt, 0);
121326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
121327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_bind_int(pStmt, 1, iIndex*FTS3_SEGDIR_MAXLEVEL);
121328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_bind_int(pStmt, 2, (iIndex+1)*FTS3_SEGDIR_MAXLEVEL-1);
121329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
119175 121330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
121331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* "SELECT * FROM %_segdir WHERE level = ? ORDER BY ..." */
119176 121332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = fts3SqlStmt(p, SQL_SELECT_LEVEL, &pStmt, 0);
119177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ) sqlite3_bind_int(pStmt, 1, iLevel);
121333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
121334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_bind_int(pStmt, 1, iLevel+iIndex*FTS3_SEGDIR_MAXLEVEL);
121335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
119178 121336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119179 121337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*ppStmt = pStmt;
119180 121338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
119181 121339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119182 121340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -119286,10 +121444,51 @@
119286 121444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pp = p;
119287 121445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 1;
119288 121446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119289 121447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return 0;
119290 121448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
121451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Free a PendingList object allocated by fts3PendingListAppend().
121452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
121453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static void fts3PendingListDelete(PendingList *pList){
121454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pList);
121455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
121458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Add an entry to one of the pending-terms hash tables.
121459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
121460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3PendingTermsAddOne(
121461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *p,
121462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iCol,
121463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iPos,
121464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Hash *pHash, /* Pending terms hash table to add entry to */
121465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zToken,
121466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nToken
121467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
121468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PendingList *pList;
121469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
121470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pList = (PendingList *)fts3HashFind(pHash, zToken, nToken);
121472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pList ){
121473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nPendingData -= (pList->nData + nToken + sizeof(Fts3HashElem));
121474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fts3PendingListAppend(&pList, p->iPrevDocid, iCol, iPos, &rc) ){
121476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pList==fts3HashInsert(pHash, zToken, nToken, pList) ){
121477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Malloc failed while inserting the new entry. This can only
121478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** happen if there was no previous entry for this token.
121479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
121480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( 0==fts3HashFind(pHash, zToken, nToken) );
121481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_free(pList);
121482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_NOMEM;
121483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
121486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nPendingData += (pList->nData + nToken + sizeof(Fts3HashElem));
121487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
121489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
119291 121490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119292 121491 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
119293 121492 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Tokenize the nul-terminated string zText and add all tokens to the
119294 121493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** pending-terms hash-table. The docid used is that currently stored in
119295 121494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** p->iPrevDocid, and the column is specified by argument iCol.
@@ -119335,12 +121534,11 @@
119335 121534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119336 121535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
xNext = pModule->xNext;
119337 121536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( SQLITE_OK==rc
119338 121537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& SQLITE_OK==(rc = xNext(pCsr, &zToken, &nToken, &iStart, &iEnd, &iPos))
119339 121538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
119340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- PendingList *pList;
119341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
121539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
119342 121540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iPos>=nWord ) nWord = iPos+1;
119343 121541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119344 121542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Positions cannot be negative; we use -1 as a terminator internally.
119345 121543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Tokens must have a non-zero length.
119346 121544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -119347,26 +121545,23 @@
119347 121545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iPos<0 || !zToken || nToken<=0 ){
119348 121546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_ERROR;
119349 121547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
119350 121548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119351 121549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pList = (PendingList *)fts3HashFind(&p->pendingTerms, zToken, nToken);
119353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pList ){
119354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->nPendingData -= (pList->nData + nToken + sizeof(Fts3HashElem));
119355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
119356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( fts3PendingListAppend(&pList, p->iPrevDocid, iCol, iPos, &rc) ){
119357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pList==fts3HashInsert(&p->pendingTerms, zToken, nToken, pList) ){
119358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Malloc failed while inserting the new entry. This can only
119359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** happen if there was no previous entry for this token.
119360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
119361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( 0==fts3HashFind(&p->pendingTerms, zToken, nToken) );
119362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(pList);
119363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_NOMEM;
119364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
119365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
119366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
119367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->nPendingData += (pList->nData + nToken + sizeof(Fts3HashElem));
121550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Add the term to the terms index */
121551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3PendingTermsAddOne(
121552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p, iCol, iPos, &p->aIndex[0].hPending, zToken, nToken
121553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
121554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Add the term to each of the prefix indexes that it is not too
121556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** short for. */
121557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=1; rc==SQLITE_OK && i<p->nIndex; i++){
121558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ struct Fts3Index *pIndex = &p->aIndex[i];
121559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nToken<pIndex->nPrefix ) continue;
121560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3PendingTermsAddOne(
121561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p, iCol, iPos, &pIndex->hPending, zToken, pIndex->nPrefix
121562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
119368 121563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119369 121564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119370 121565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119371 121566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pModule->xClose(pCsr);
119372 121567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pnWord = nWord;
@@ -119392,18 +121587,23 @@
119392 121587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->iPrevDocid = iDocid;
119393 121588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
119394 121589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119395 121590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119396 121591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
119397 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Discard the contents of the pending-terms hash table.
121592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Discard the contents of the pending-terms hash tables.
119398 121593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
119399 121594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Fts3PendingTermsClear(Fts3Table *p){
119400 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3HashElem *pElem;
119401 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(pElem=fts3HashFirst(&p->pendingTerms); pElem; pElem=fts3HashNext(pElem)){
119402 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(fts3HashData(pElem));
121595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
121596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<p->nIndex; i++){
121597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3HashElem *pElem;
121598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Hash *pHash = &p->aIndex[i].hPending;
121599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pElem=fts3HashFirst(pHash); pElem; pElem=fts3HashNext(pElem)){
121600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ PendingList *pList = (PendingList *)fts3HashData(pElem);
121601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PendingListDelete(pList);
121602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3HashClear(pHash);
119403 121604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3HashClear(&p->pendingTerms);
119405 121605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nPendingData = 0;
119406 121606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119407 121607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119408 121608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
119409 121609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function is called by the xUpdate() method as part of an INSERT
@@ -119555,11 +121755,11 @@
119555 121755 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119556 121756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
119557 121757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Forward declaration to account for the circular dependency between
119558 121758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** functions fts3SegmentMerge() and fts3AllocateSegdirIdx().
119559 121759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
119560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3SegmentMerge(Fts3Table *, int);
121760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3SegmentMerge(Fts3Table *, int, int);
119561 121761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119562 121762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
119563 121763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function allocates a new level iLevel index in the segdir table.
119564 121764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Usually, indexes are allocated within a level sequentially starting
119565 121765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** with 0, so the allocated index is one greater than the value returned
@@ -119572,19 +121772,24 @@
119572 121772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** allocated index is 0.
119573 121773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
119574 121774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If successful, *piIdx is set to the allocated index slot and SQLITE_OK
119575 121775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** returned. Otherwise, an SQLite error code is returned.
119576 121776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
119577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3AllocateSegdirIdx(Fts3Table *p, int iLevel, int *piIdx){
121777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3AllocateSegdirIdx(
121778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *p,
121779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iIndex, /* Index for p->aIndex */
121780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iLevel,
121781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *piIdx
121782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
119578 121783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc; /* Return Code */
119579 121784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_stmt *pNextIdx; /* Query for next idx at level iLevel */
119580 121785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iNext = 0; /* Result of query pNextIdx */
119581 121786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119582 121787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Set variable iNext to the next available segdir index at level iLevel. */
119583 121788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = fts3SqlStmt(p, SQL_NEXT_SEGMENT_INDEX, &pNextIdx, 0);
119584 121789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
119585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_bind_int(pNextIdx, 1, iLevel);
121790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_bind_int(pNextIdx, 1, iIndex*FTS3_SEGDIR_MAXLEVEL + iLevel);
119586 121791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( SQLITE_ROW==sqlite3_step(pNextIdx) ){
119587 121792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iNext = sqlite3_column_int(pNextIdx, 0);
119588 121793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119589 121794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3_reset(pNextIdx);
119590 121795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -119594,11 +121799,11 @@
119594 121799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** full, merge all segments in level iLevel into a single iLevel+1
119595 121800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** segment and allocate (newly freed) index 0 at level iLevel. Otherwise,
119596 121801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** if iNext is less than FTS3_MERGE_COUNT, allocate index iNext.
119597 121802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
119598 121803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iNext>=FTS3_MERGE_COUNT ){
119599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3SegmentMerge(p, iLevel);
121804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegmentMerge(p, iIndex, iLevel);
119600 121805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*piIdx = 0;
119601 121806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
119602 121807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*piIdx = iNext;
119603 121808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119604 121809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -119635,11 +121840,12 @@
119635 121840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
119636 121841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3ReadBlock(
119637 121842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *p, /* FTS3 table handle */
119638 121843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iBlockid, /* Access the row with blockid=$iBlockid */
119639 121844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char **paBlob, /* OUT: Blob data in malloc'd buffer */
119640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pnBlob /* OUT: Size of blob data */
121845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pnBlob, /* OUT: Size of blob data */
121846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pnLoad /* OUT: Bytes actually loaded */
119641 121847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
119642 121848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc; /* Return code */
119643 121849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119644 121850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* pnBlob must be non-NULL. paBlob may be NULL or non-NULL. */
119645 121851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pnBlob);
@@ -119656,25 +121862,29 @@
119656 121862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
119657 121863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119658 121864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119659 121865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
119660 121866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nByte = sqlite3_blob_bytes(p->pSegments);
121867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnBlob = nByte;
119661 121868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( paBlob ){
119662 121869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aByte = sqlite3_malloc(nByte + FTS3_NODE_PADDING);
119663 121870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !aByte ){
119664 121871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_NOMEM;
119665 121872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
121873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pnLoad && nByte>(FTS3_NODE_CHUNK_THRESHOLD) ){
121874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nByte = FTS3_NODE_CHUNKSIZE;
121875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnLoad = nByte;
121876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
119666 121877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3_blob_read(p->pSegments, aByte, nByte, 0);
119667 121878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&aByte[nByte], 0, FTS3_NODE_PADDING);
119668 121879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
119669 121880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(aByte);
119670 121881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aByte = 0;
119671 121882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119672 121883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119673 121884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*paBlob = aByte;
119674 121885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119675 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnBlob = nByte;
119676 121886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119677 121887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119678 121888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
119679 121889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119680 121890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -119684,17 +121894,59 @@
119684 121894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
119685 121895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Fts3SegmentsClose(Fts3Table *p){
119686 121896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_blob_close(p->pSegments);
119687 121897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->pSegments = 0;
119688 121898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3SegReaderIncrRead(Fts3SegReader *pReader){
121901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nRead; /* Number of bytes to read */
121902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return code */
121903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nRead = MIN(pReader->nNode - pReader->nPopulate, FTS3_NODE_CHUNKSIZE);
121905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3_blob_read(
121906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->pBlob,
121907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ &pReader->aNode[pReader->nPopulate],
121908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nRead,
121909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->nPopulate
121910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
121911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
121913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->nPopulate += nRead;
121914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memset(&pReader->aNode[pReader->nPopulate], 0, FTS3_NODE_PADDING);
121915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pReader->nPopulate==pReader->nNode ){
121916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_blob_close(pReader->pBlob);
121917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->pBlob = 0;
121918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->nPopulate = 0;
121919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
121922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
121924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3SegReaderRequire(Fts3SegReader *pReader, char *pFrom, int nByte){
121925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
121926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !pReader->pBlob
121927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || (pFrom>=pReader->aNode && pFrom<&pReader->aNode[pReader->nNode])
121928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
121929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( pReader->pBlob && rc==SQLITE_OK
121930 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (pFrom - pReader->aNode + nByte)>pReader->nPopulate
121931 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
121932 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderIncrRead(pReader);
121933 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121934 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
121935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
119689 121936 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119690 121937 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
119691 121938 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Move the iterator passed as the first argument to the next term in the
119692 121939 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** segment. If successful, SQLITE_OK is returned. If there is no next term,
119693 121940 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SQLITE_DONE. Otherwise, an SQLite error code.
119694 121941 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
119695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3SegReaderNext(Fts3Table *p, Fts3SegReader *pReader){
121942 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3SegReaderNext(
121943 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *p,
121944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3SegReader *pReader,
121945 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bIncr
121946 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
121947 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc; /* Return code of various sub-routines */
119696 121948 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *pNext; /* Cursor variable */
119697 121949 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nPrefix; /* Number of bytes in term prefix */
119698 121950 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nSuffix; /* Number of bytes in term suffix */
119699 121951 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119700 121952 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !pReader->aDoclist ){
@@ -119702,11 +121954,10 @@
119702 121954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
119703 121955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNext = &pReader->aDoclist[pReader->nDoclist];
119704 121956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119705 121957 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119706 121958 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !pNext || pNext>=&pReader->aNode[pReader->nNode] ){
119707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc; /* Return code from Fts3ReadBlock() */
119708 121959 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119709 121960 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( fts3SegReaderIsPending(pReader) ){
119710 121961 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3HashElem *pElem = *(pReader->ppNextElem);
119711 121962 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pElem==0 ){
119712 121963 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pReader->aNode = 0;
@@ -119722,10 +121973,12 @@
119722 121973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
119723 121974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119724 121975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119725 121976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !fts3SegReaderIsRootOnly(pReader) ){
119726 121977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pReader->aNode);
121978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_blob_close(pReader->pBlob);
121979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->pBlob = 0;
119727 121980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119728 121981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pReader->aNode = 0;
119729 121982 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119730 121983 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If iCurrentBlock>=iLeafEndBlock, this is an EOF condition. All leaf
119731 121984 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** blocks have already been traversed. */
@@ -119733,19 +121986,29 @@
119733 121986 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pReader->iCurrentBlock>=pReader->iLeafEndBlock ){
119734 121987 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
119735 121988 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119736 121989 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119737 121990 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3Fts3ReadBlock(
119738 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p, ++pReader->iCurrentBlock, &pReader->aNode, &pReader->nNode
121991 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p, ++pReader->iCurrentBlock, &pReader->aNode, &pReader->nNode,
121992 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ (bIncr ? &pReader->nPopulate : 0)
119739 121993 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
);
119740 121994 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) return rc;
121995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pReader->pBlob==0 );
121996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bIncr && pReader->nPopulate<pReader->nNode ){
121997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->pBlob = p->pSegments;
121998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pSegments = 0;
121999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
119741 122000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNext = pReader->aNode;
119742 122001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
122002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( !fts3SegReaderIsPending(pReader) );
122004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderRequire(pReader, pNext, FTS3_VARINT_MAX*2);
122006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) return rc;
119743 122007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119744 122008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Because of the FTS3_NODE_PADDING bytes of padding, the following is
119745 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** safe (no risk of overread) even if the node data is corrupted.
119746 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
122009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** safe (no risk of overread) even if the node data is corrupted. */
119747 122010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNext += sqlite3Fts3GetVarint32(pNext, &nPrefix);
119748 122011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNext += sqlite3Fts3GetVarint32(pNext, &nSuffix);
119749 122012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nPrefix<0 || nSuffix<=0
119750 122013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
|| &pNext[nSuffix]>&pReader->aNode[pReader->nNode]
119751 122014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
@@ -119759,10 +122022,14 @@
119759 122022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_NOMEM;
119760 122023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119761 122024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pReader->zTerm = zNew;
119762 122025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pReader->nTermAlloc = nNew;
119763 122026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
122027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderRequire(pReader, pNext, nSuffix+FTS3_VARINT_MAX);
122029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) return rc;
122030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
119764 122031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(&pReader->zTerm[nPrefix], pNext, nSuffix);
119765 122032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pReader->nTerm = nPrefix+nSuffix;
119766 122033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNext += nSuffix;
119767 122034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNext += sqlite3Fts3GetVarint32(pNext, &pReader->nDoclist);
119768 122035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pReader->aDoclist = pNext;
@@ -119771,11 +122038,11 @@
119771 122038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Check that the doclist does not appear to extend past the end of the
119772 122039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** b-tree node. And that the final byte of the doclist is 0x00. If either
119773 122040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of these statements is untrue, then the data structure is corrupt.
119774 122041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
119775 122042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( &pReader->aDoclist[pReader->nDoclist]>&pReader->aNode[pReader->nNode]
119776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- || pReader->aDoclist[pReader->nDoclist-1]
122043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || (pReader->nPopulate==0 && pReader->aDoclist[pReader->nDoclist-1])
119777 122044 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
119778 122045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_CORRUPT_VTAB;
119779 122046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119780 122047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
119781 122048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -119782,16 +122049,30 @@
119782 122049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119783 122050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
119784 122051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Set the SegReader to point to the first docid in the doclist associated
119785 122052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** with the current term.
119786 122053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
119787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void fts3SegReaderFirstDocid(Fts3SegReader *pReader){
119788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int n;
122054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3SegReaderFirstDocid(Fts3Table *pTab, Fts3SegReader *pReader){
122055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
119789 122056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pReader->aDoclist );
119790 122057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( !pReader->pOffsetList );
119791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- n = sqlite3Fts3GetVarint(pReader->aDoclist, &pReader->iDocid);
119792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pReader->pOffsetList = &pReader->aDoclist[n];
122058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pTab->bDescIdx && fts3SegReaderIsPending(pReader) ){
122059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 bEof = 0;
122060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->iDocid = 0;
122061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->nOffsetList = 0;
122062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Fts3DoclistPrev(0,
122063 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->aDoclist, pReader->nDoclist, &pReader->pOffsetList,
122064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ &pReader->iDocid, &pReader->nOffsetList, &bEof
122065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
122066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
122067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderRequire(pReader, pReader->aDoclist, FTS3_VARINT_MAX);
122068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
122069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int n = sqlite3Fts3GetVarint(pReader->aDoclist, &pReader->iDocid);
122070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->pOffsetList = &pReader->aDoclist[n];
122071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
119793 122074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119794 122075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119795 122076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
119796 122077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Advance the SegReader to point to the next docid in the doclist
119797 122078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** associated with the current term.
@@ -119800,132 +122081,129 @@
119800 122081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** *ppOffsetList is set to point to the first column-offset list
119801 122082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** in the doclist entry (i.e. immediately past the docid varint).
119802 122083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** *pnOffsetList is set to the length of the set of column-offset
119803 122084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** lists, not including the nul-terminator byte. For example:
119804 122085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
119805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void fts3SegReaderNextDocid(
119806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReader *pReader,
119807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char **ppOffsetList,
119808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pnOffsetList
122086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3SegReaderNextDocid(
122087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *pTab,
122088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3SegReader *pReader, /* Reader to advance to next docid */
122089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char **ppOffsetList, /* OUT: Pointer to current position-list */
122090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pnOffsetList /* OUT: Length of *ppOffsetList in bytes */
119809 122091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
122092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
119810 122093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *p = pReader->pOffsetList;
119811 122094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char c = 0;
119812 122095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Pointer p currently points at the first byte of an offset list. The
119814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** following two lines advance it to point one byte past the end of
119815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the same offset list.
119816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
119817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( *p | c ) c = *p++ & 0x80;
119818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p++;
119819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
119820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If required, populate the output variables with a pointer to and the
119821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** size of the previous offset-list.
119822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
119823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ppOffsetList ){
119824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *ppOffsetList = pReader->pOffsetList;
119825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnOffsetList = (int)(p - pReader->pOffsetList - 1);
119826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
119827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
119828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If there are no more entries in the doclist, set pOffsetList to
119829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** NULL. Otherwise, set Fts3SegReader.iDocid to the next docid and
119830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Fts3SegReader.pOffsetList to point to the next offset list before
119831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** returning.
119832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
119833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p>=&pReader->aDoclist[pReader->nDoclist] ){
119834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pReader->pOffsetList = 0;
122096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p );
122097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pTab->bDescIdx && fts3SegReaderIsPending(pReader) ){
122099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* A pending-terms seg-reader for an FTS4 table that uses order=desc.
122100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Pending-terms doclists are always built up in ascending order, so
122101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** we have to iterate through them backwards here. */
122102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u8 bEof = 0;
122103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ppOffsetList ){
122104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *ppOffsetList = pReader->pOffsetList;
122105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnOffsetList = pReader->nOffsetList - 1;
122106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Fts3DoclistPrev(0,
122108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->aDoclist, pReader->nDoclist, &p, &pReader->iDocid,
122109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ &pReader->nOffsetList, &bEof
122110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
122111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bEof ){
122112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->pOffsetList = 0;
122113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
122114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->pOffsetList = p;
122115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
119835 122116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
119836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 iDelta;
119837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pReader->pOffsetList = p + sqlite3Fts3GetVarint(p, &iDelta);
119838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pReader->iDocid += iDelta;
119839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
119840 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
119841 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
119842 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
119843 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This function is called to estimate the amount of data that will be
119844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** loaded from the disk If SegReaderIterate() is called on this seg-reader,
119845 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** in units of average document size.
119846 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
119847 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This can be used as follows: If the caller has a small doclist that
119848 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** contains references to N documents, and is considering merging it with
119849 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** a large doclist (size X "average documents"), it may opt not to load
119850 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the large doclist if X>N.
119851 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
119852 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3SegReaderCost(
119853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Cursor *pCsr, /* FTS3 cursor handle */
119854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReader *pReader, /* Segment-reader handle */
119855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int *pnCost /* IN/OUT: Number of bytes read */
122117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pEnd = &pReader->aDoclist[pReader->nDoclist];
122118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Pointer p currently points at the first byte of an offset list. The
122120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** following block advances it to point one byte past the end of
122121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the same offset list. */
122122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( 1 ){
122123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The following line of code (and the "p++" below the while() loop) is
122125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** normally all that is required to move pointer p to the desired
122126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** position. The exception is if this node is being loaded from disk
122127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** incrementally and pointer "p" now points to the first byte passed
122128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the populated part of pReader->aNode[].
122129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
122130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( *p | c ) c = *p++ & 0x80;
122131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( *p==0 );
122132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pReader->pBlob==0 || p<&pReader->aNode[pReader->nPopulate] ) break;
122134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderIncrRead(pReader);
122135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) return rc;
122136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p++;
122138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If required, populate the output variables with a pointer to and the
122140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** size of the previous offset-list.
122141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
122142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( ppOffsetList ){
122143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *ppOffsetList = pReader->pOffsetList;
122144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnOffsetList = (int)(p - pReader->pOffsetList - 1);
122145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( p<pEnd && *p==0 ) p++;
122148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* If there are no more entries in the doclist, set pOffsetList to
122150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** NULL. Otherwise, set Fts3SegReader.iDocid to the next docid and
122151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Fts3SegReader.pOffsetList to point to the next offset list before
122152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** returning.
122153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
122154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p>=pEnd ){
122155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->pOffsetList = 0;
122156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
122157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderRequire(pReader, p, FTS3_VARINT_MAX);
122158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
122159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iDelta;
122160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->pOffsetList = p + sqlite3Fts3GetVarint(p, &iDelta);
122161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pTab->bDescIdx ){
122162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->iDocid -= iDelta;
122163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
122164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pReader->iDocid += iDelta;
122165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
122171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3MsrOvfl(
122175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Cursor *pCsr,
122176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pMsr,
122177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pnOvfl
119856 122178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
119857 122179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *p = (Fts3Table*)pCsr->base.pVtab;
119858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = SQLITE_OK; /* Return code */
119859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nCost = 0; /* Cost in bytes to return */
119860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int pgsz = p->nPgsz; /* Database page size */
119861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
119862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* If this seg-reader is reading the pending-terms table, or if all data
119863 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** for the segment is stored on the root page of the b-tree, then the cost
119864 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** is zero. In this case all required data is already in main memory.
119865 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
119866 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( p->bHasStat
119867 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && !fts3SegReaderIsPending(pReader)
119868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && !fts3SegReaderIsRootOnly(pReader)
119869 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
119870 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nBlob = 0;
119871 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 iBlock;
119872 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
119873 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr->nRowAvg==0 ){
119874 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* The average document size, which is required to calculate the cost
119875 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of each doclist, has not yet been determined. Read the required
119876 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** data from the %_stat table to calculate it.
119877 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
119878 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Entry 0 of the %_stat table is a blob containing (nCol+1) FTS3
119879 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** varints, where nCol is the number of columns in the FTS3 table.
119880 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The first varint is the number of documents currently stored in
119881 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** the table. The following nCol varints contain the total amount of
119882 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** data stored in all rows of each column of the table, from left
119883 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** to right.
119884 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
119885 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_stmt *pStmt;
119886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 nDoc = 0;
119887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 nByte = 0;
119888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *pEnd;
119889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *a;
119890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
119891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3SelectDoctotal(p, &pStmt);
119892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) return rc;
119893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a = sqlite3_column_blob(pStmt, 0);
119894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( a );
119895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
119896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pEnd = &a[sqlite3_column_bytes(pStmt, 0)];
119897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a += sqlite3Fts3GetVarint(a, &nDoc);
119898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( a<pEnd ){
119899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- a += sqlite3Fts3GetVarint(a, &nByte);
119900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
119901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nDoc==0 || nByte==0 ){
119902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_reset(pStmt);
119903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_CORRUPT_VTAB;
119904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
119905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
119906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->nRowAvg = (int)(((nByte / nDoc) + pgsz) / pgsz);
119907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pCsr->nRowAvg>0 );
119908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3_reset(pStmt);
119909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) return rc;
119910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
119911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
119912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Assume that a blob flows over onto overflow pages if it is larger
119913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** than (pgsz-35) bytes in size (the file-format documentation
119914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** confirms this).
119915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
119916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(iBlock=pReader->iStartBlock; iBlock<=pReader->iLeafEndBlock; iBlock++){
119917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3ReadBlock(p, iBlock, 0, &nBlob);
119918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) break;
119919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( (nBlob+35)>pgsz ){
119920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nOvfl = (nBlob + 34)/pgsz;
119921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nCost += ((nOvfl + pCsr->nRowAvg - 1)/pCsr->nRowAvg);
119922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
119923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
119924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
119925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
119926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnCost += nCost;
122180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nOvfl = 0;
122181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int ii;
122182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
122183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int pgsz = p->nPgsz;
122184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( p->bHasStat );
122186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pgsz>0 );
122187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(ii=0; rc==SQLITE_OK && ii<pMsr->nSegment; ii++){
122189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3SegReader *pReader = pMsr->apSegment[ii];
122190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !fts3SegReaderIsPending(pReader)
122191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && !fts3SegReaderIsRootOnly(pReader)
122192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
122193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 jj;
122194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(jj=pReader->iStartBlock; jj<=pReader->iLeafEndBlock; jj++){
122195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nBlob;
122196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3ReadBlock(p, jj, 0, &nBlob, 0);
122197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) break;
122198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( (nBlob+35)>pgsz ){
122199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nOvfl += (nBlob + 34)/pgsz;
122200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnOvfl = nOvfl;
119927 122205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
119928 122206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119929 122207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
119930 122208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
119931 122209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Free all allocations associated with the iterator passed as the
@@ -119934,10 +122212,11 @@
119934 122212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Fts3SegReaderFree(Fts3SegReader *pReader){
119935 122213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pReader && !fts3SegReaderIsPending(pReader) ){
119936 122214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pReader->zTerm);
119937 122215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !fts3SegReaderIsRootOnly(pReader) ){
119938 122216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pReader->aNode);
122217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_blob_close(pReader->pBlob);
119939 122218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119940 122219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119941 122220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pReader);
119942 122221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
119943 122222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -120010,28 +122289,46 @@
120010 122289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120011 122290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120012 122291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
120013 122292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This function is used to allocate an Fts3SegReader that iterates through
120014 122293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a subset of the terms stored in the Fts3Table.pendingTerms array.
122294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
122295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If the isPrefixIter parameter is zero, then the returned SegReader iterates
122296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** through each term in the pending-terms table. Or, if isPrefixIter is
122297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** non-zero, it iterates through each term and its prefixes. For example, if
122298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the pending terms hash table contains the terms "sqlite", "mysql" and
122299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** "firebird", then the iterator visits the following 'terms' (in the order
122300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** shown):
122301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
122302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** f fi fir fire fireb firebi firebir firebird
122303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** m my mys mysq mysql
122304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** s sq sql sqli sqlit sqlite
122305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
122306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Whereas if isPrefixIter is zero, the terms visited are:
122307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
122308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** firebird mysql sqlite
120015 122309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
120016 122310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3SegReaderPending(
120017 122311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *p, /* Virtual table handle */
122312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iIndex, /* Index for p->aIndex */
120018 122313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
const char *zTerm, /* Term to search for */
120019 122314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nTerm, /* Size of buffer zTerm */
120020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int isPrefix, /* True for a term-prefix query */
122315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bPrefix, /* True for a prefix iterator */
120021 122316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3SegReader **ppReader /* OUT: SegReader for pending-terms */
120022 122317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
120023 122318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3SegReader *pReader = 0; /* Fts3SegReader object to return */
120024 122319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3HashElem **aElem = 0; /* Array of term hash entries to scan */
120025 122320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nElem = 0; /* Size of array at aElem */
120026 122321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK; /* Return Code */
122322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Hash *pHash;
120027 122323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( isPrefix ){
122324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pHash = &p->aIndex[iIndex].hPending;
122325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bPrefix ){
120029 122326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nAlloc = 0; /* Size of allocated array at aElem */
120030 122327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3HashElem *pE = 0; /* Iterator variable */
120031 122328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(pE=fts3HashFirst(&p->pendingTerms); pE; pE=fts3HashNext(pE)){
122329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(pE=fts3HashFirst(pHash); pE; pE=fts3HashNext(pE)){
120033 122330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zKey = (char *)fts3HashKey(pE);
120034 122331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nKey = fts3HashKeysize(pE);
120035 122332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nTerm==0 || (nKey>=nTerm && 0==memcmp(zKey, zTerm, nTerm)) ){
120036 122333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nElem==nAlloc ){
120037 122334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3HashElem **aElem2;
@@ -120044,10 +122341,11 @@
120044 122341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nElem = 0;
120045 122342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
120046 122343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120047 122344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aElem = aElem2;
120048 122345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
122346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
120049 122347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aElem[nElem++] = pE;
120050 122348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120051 122349 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120052 122350 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120053 122351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If more than one term matches the prefix, sort the Fts3HashElem
@@ -120057,11 +122355,13 @@
120057 122355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nElem>1 ){
120058 122356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
qsort(aElem, nElem, sizeof(Fts3HashElem *), fts3CompareElemByTerm);
120059 122357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120060 122358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120061 122359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
120062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3HashElem *pE = fts3HashFindElem(&p->pendingTerms, zTerm, nTerm);
122360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* The query is a simple term lookup that matches at most one term in
122361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** the index. All that is required is a straight hash-lookup. */
122362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3HashElem *pE = fts3HashFindElem(pHash, zTerm, nTerm);
120063 122363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pE ){
120064 122364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aElem = &pE;
120065 122365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nElem = 1;
120066 122366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120067 122367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -120077,11 +122377,11 @@
120077 122377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pReader->ppNextElem = (Fts3HashElem **)&pReader[1];
120078 122378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(pReader->ppNextElem, aElem, nElem*sizeof(Fts3HashElem *));
120079 122379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120080 122380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120081 122381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( isPrefix ){
122382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( bPrefix ){
120083 122383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(aElem);
120084 122384 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120085 122385 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*ppReader = pReader;
120086 122386 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
120087 122387 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -120137,10 +122437,22 @@
120137 122437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pLhs->iDocid==pRhs->iDocid ){
120138 122438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = pRhs->iIdx - pLhs->iIdx;
120139 122439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
120140 122440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = (pLhs->iDocid > pRhs->iDocid) ? 1 : -1;
120141 122441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
122442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pLhs->aNode && pRhs->aNode );
122444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
122445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3SegReaderDoclistCmpRev(Fts3SegReader *pLhs, Fts3SegReader *pRhs){
122447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = (pLhs->pOffsetList==0)-(pRhs->pOffsetList==0);
122448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==0 ){
122449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pLhs->iDocid==pRhs->iDocid ){
122450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = pRhs->iIdx - pLhs->iIdx;
122451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
122452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = (pLhs->iDocid < pRhs->iDocid) ? 1 : -1;
122453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
120142 122454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120143 122455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pLhs->aNode && pRhs->aNode );
120144 122456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
120145 122457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120146 122458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -120689,25 +123001,34 @@
120689 123001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120690 123002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
120691 123003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120692 123004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120693 123005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
120694 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Set *pnSegment to the total number of segments in the database. Set
120695 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** *pnMax to the largest segment level in the database (segment levels
120696 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** are stored in the 'level' column of the %_segdir table).
123006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Set *pnMax to the largest segment level in the database for the index
123007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** iIndex.
123008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
123009 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Segment levels are stored in the 'level' column of the %_segdir table.
120697 123010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
120698 123011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Return SQLITE_OK if successful, or an SQLite error code if not.
120699 123012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
120700 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3SegmentCountMax(Fts3Table *p, int *pnSegment, int *pnMax){
123013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3SegmentMaxLevel(Fts3Table *p, int iIndex, int *pnMax){
120701 123014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_stmt *pStmt;
120702 123015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc;
123016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iIndex>=0 && iIndex<p->nIndex );
120703 123017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120704 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_COUNT_MAX, &pStmt, 0);
123018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Set pStmt to the compiled version of:
123019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
123020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** SELECT max(level) FROM %Q.'%q_segdir' WHERE level BETWEEN ? AND ?
123021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
123022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** (1024 is actually the value of macro FTS3_SEGDIR_PREFIXLEVEL_STR).
123023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
123024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SqlStmt(p, SQL_SELECT_SEGDIR_MAX_LEVEL, &pStmt, 0);
120705 123025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) return rc;
123026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_bind_int(pStmt, 1, iIndex*FTS3_SEGDIR_MAXLEVEL);
123027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_bind_int(pStmt, 2, (iIndex+1)*FTS3_SEGDIR_MAXLEVEL - 1);
120706 123028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( SQLITE_ROW==sqlite3_step(pStmt) ){
120707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnSegment = sqlite3_column_int(pStmt, 0);
120708 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnMax = sqlite3_column_int(pStmt, 1);
123029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnMax = sqlite3_column_int(pStmt, 0);
120709 123030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120710 123031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return sqlite3_reset(pStmt);
120711 123032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120712 123033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120713 123034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -120724,10 +123045,11 @@
120724 123045 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
120725 123046 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** SQLITE_OK is returned if successful, otherwise an SQLite error code.
120726 123047 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
120727 123048 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3DeleteSegdir(
120728 123049 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *p, /* Virtual table handle */
123050 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iIndex, /* Index for p->aIndex */
120729 123051 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iLevel, /* Level of %_segdir entries to delete */
120730 123052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3SegReader **apSegment, /* Array of SegReader objects */
120731 123053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nReader /* Size of array apSegment */
120732 123054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
120733 123055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc; /* Return Code */
@@ -120746,23 +123068,28 @@
120746 123068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120747 123069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
120748 123070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
120749 123071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120750 123072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
123073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iLevel>=0 || iLevel==FTS3_SEGCURSOR_ALL );
120751 123074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iLevel==FTS3_SEGCURSOR_ALL ){
120752 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3SqlExec(&rc, p, SQL_DELETE_ALL_SEGDIR, 0);
120753 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else if( iLevel==FTS3_SEGCURSOR_PENDING ){
120754 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3Fts3PendingTermsClear(p);
123075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_RANGE, &pDelete, 0);
123076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
123077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_bind_int(pDelete, 1, iIndex*FTS3_SEGDIR_MAXLEVEL);
123078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_bind_int(pDelete, 2, (iIndex+1) * FTS3_SEGDIR_MAXLEVEL - 1);
123079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
120755 123080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
120756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( iLevel>=0 );
120757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_BY_LEVEL, &pDelete, 0);
123081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SqlStmt(p, SQL_DELETE_SEGDIR_LEVEL, &pDelete, 0);
120758 123082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
120759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_bind_int(pDelete, 1, iLevel);
120760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_step(pDelete);
120761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3_reset(pDelete);
123083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_bind_int(pDelete, 1, iIndex*FTS3_SEGDIR_MAXLEVEL + iLevel);
120762 123084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120763 123085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
123086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ){
123088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_step(pDelete);
123089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3_reset(pDelete);
123090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
120764 123091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120765 123092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
120766 123093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120767 123094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120768 123095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -120806,44 +123133,216 @@
120806 123133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120807 123134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*ppList = pList;
120808 123135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pnList = nList;
120809 123136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120810 123137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE int sqlite3Fts3SegReaderStart(
123138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
123139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Cache data in the Fts3MultiSegReader.aBuffer[] buffer (overwriting any
123140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** existing data). Grow the buffer if required.
123141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
123142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** If successful, return SQLITE_OK. Otherwise, if an OOM error is encountered
123143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** trying to resize the buffer, return SQLITE_NOMEM.
123144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
123145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3MsrBufferData(
123146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pMsr, /* Multi-segment-reader handle */
123147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pList,
123148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nList
123149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
123150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nList>pMsr->nBuffer ){
123151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pNew;
123152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pMsr->nBuffer = nList*2;
123153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pNew = (char *)sqlite3_realloc(pMsr->aBuffer, pMsr->nBuffer);
123154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pNew ) return SQLITE_NOMEM;
123155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pMsr->aBuffer = pNew;
123156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(pMsr->aBuffer, pList, nList);
123159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
123160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3MsrIncrNext(
123163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *p, /* Virtual table handle */
123164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pMsr, /* Multi-segment-reader handle */
123165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 *piDocid, /* OUT: Docid value */
123166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char **paPoslist, /* OUT: Pointer to position list */
123167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pnPoslist /* OUT: Size of position list in bytes */
123168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
123169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nMerge = pMsr->nAdvance;
123170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3SegReader **apSegment = pMsr->apSegment;
123171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = (
123172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp
123173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
123174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nMerge==0 ){
123176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *paPoslist = 0;
123177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
123178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( 1 ){
123181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3SegReader *pSeg;
123182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pSeg = pMsr->apSegment[0];
123183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pSeg->pOffsetList==0 ){
123185 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *paPoslist = 0;
123186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
123187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
123188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
123189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pList;
123190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nList;
123191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int j;
123192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iDocid = apSegment[0]->iDocid;
123193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderNextDocid(p, apSegment[0], &pList, &nList);
123195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ j = 1;
123196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ while( rc==SQLITE_OK
123197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && j<nMerge
123198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && apSegment[j]->pOffsetList
123199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && apSegment[j]->iDocid==iDocid
123200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
123201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderNextDocid(p, apSegment[j], 0, 0);
123202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ j++;
123203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) return rc;
123205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3SegReaderSort(pMsr->apSegment, nMerge, j, xCmp);
123206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pMsr->iColFilter>=0 ){
123208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3ColumnFilter(pMsr->iColFilter, &pList, &nList);
123209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123211 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nList>0 ){
123212 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fts3SegReaderIsPending(apSegment[0]) ){
123213 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3MsrBufferData(pMsr, pList, nList+1);
123214 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) return rc;
123215 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *paPoslist = pMsr->aBuffer;
123216 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( (pMsr->aBuffer[nList] & 0xFE)==0x00 );
123217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
123218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *paPoslist = pList;
123219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123220 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *piDocid = iDocid;
123221 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnPoslist = nList;
123222 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
123223 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123224 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123225 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123226 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123227 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
123228 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123229 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3SegReaderStart(
120812 123231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *p, /* Virtual table handle */
120813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReaderCursor *pCsr, /* Cursor object */
120814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegFilter *pFilter /* Restrictions on range of iteration */
123232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pCsr, /* Cursor object */
123233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTerm, /* Term searched for (or NULL) */
123234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nTerm /* Length of zTerm in bytes */
120815 123235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
120816 123236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
120817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
120818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Initialize the cursor object */
120819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->pFilter = pFilter;
123237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nSeg = pCsr->nSegment;
120820 123238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120821 123239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If the Fts3SegFilter defines a specific term (or term prefix) to search
120822 123240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** for, then advance each segment iterator until it points to a term of
120823 123241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** equal or greater value than the specified term. This prevents many
120824 123242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** unnecessary merge/sort operations for the case where single segment
120825 123243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** b-tree leaf nodes contain more than one term.
120826 123244 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
120827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<pCsr->nSegment; i++){
120828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nTerm = pFilter->nTerm;
120829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- const char *zTerm = pFilter->zTerm;
123245 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; pCsr->bRestart==0 && i<pCsr->nSegment; i++){
120830 123246 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3SegReader *pSeg = pCsr->apSegment[i];
120831 123247 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
do {
120832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = fts3SegReaderNext(p, pSeg);
123248 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = fts3SegReaderNext(p, pSeg, 0);
120833 123249 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) return rc;
120834 123250 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}while( zTerm && fts3SegReaderTermCmp(pSeg, zTerm, nTerm)<0 );
120835 123251 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3SegReaderSort(
120837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->apSegment, pCsr->nSegment, pCsr->nSegment, fts3SegReaderCmp);
123252 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3SegReaderSort(pCsr->apSegment, nSeg, nSeg, fts3SegReaderCmp);
123253 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123254 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
123255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123256 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123257 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3SegReaderStart(
123258 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *p, /* Virtual table handle */
123259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pCsr, /* Cursor object */
123260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3SegFilter *pFilter /* Restrictions on range of iteration */
123261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
123262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->pFilter = pFilter;
123263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return fts3SegReaderStart(p, pCsr, pFilter->zTerm, pFilter->nTerm);
123264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3MsrIncrStart(
123267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Table *p, /* Virtual table handle */
123268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pCsr, /* Cursor object */
123269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iCol, /* Column to match on. */
123270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ const char *zTerm, /* Term to iterate through a doclist for */
123271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nTerm /* Number of bytes in zTerm */
123272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
123273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
123274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc;
123275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nSegment = pCsr->nSegment;
123276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = (
123277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp
123278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
123279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pCsr->pFilter==0 );
123281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( zTerm && nTerm>0 );
123282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Advance each segment iterator until it points to the term zTerm/nTerm. */
123284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderStart(p, pCsr, zTerm, nTerm);
123285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) return rc;
123286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Determine how many of the segments actually point to zTerm/nTerm. */
123288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<nSegment; i++){
123289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3SegReader *pSeg = pCsr->apSegment[i];
123290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pSeg->aNode || fts3SegReaderTermCmp(pSeg, zTerm, nTerm) ){
123291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ break;
123292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123293 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123294 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->nAdvance = i;
123295 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123296 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Advance each of the segments to point to the first docid. */
123297 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<pCsr->nAdvance; i++){
123298 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderFirstDocid(p, pCsr->apSegment[i]);
123299 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) return rc;
123300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123301 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3SegReaderSort(pCsr->apSegment, i, i, xCmp);
123302 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iCol<0 || iCol<p->nColumn );
123304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->iColFilter = iCol;
123305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123306 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
123307 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123308 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /*
123310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** This function is called on a MultiSegReader that has been started using
123311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3Fts3MsrIncrStart(). One or more calls to MsrIncrNext() may also
123312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** have been made. Calling this function puts the MultiSegReader in such
123313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** a state that if the next two calls are:
123314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
123315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3Fts3SegReaderStart()
123316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** sqlite3Fts3SegReaderStep()
123317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ **
123318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** then the entire doclist for the term is available in
123319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** MultiSegReader.aDoclist/nDoclist.
123320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ */
123321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3MsrIncrRestart(Fts3MultiSegReader *pCsr){
123322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i; /* Used to iterate through segment-readers */
123323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pCsr->zTerm==0 );
123325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pCsr->nTerm==0 );
123326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pCsr->aDoclist==0 );
123327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( pCsr->nDoclist==0 );
123328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->nAdvance = 0;
123330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->bRestart = 1;
123331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<pCsr->nSegment; i++){
123332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->apSegment[i]->pOffsetList = 0;
123333 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->apSegment[i]->nOffsetList = 0;
123334 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->apSegment[i]->iDocid = 0;
123335 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
120838 123336 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120839 123337 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
120840 123338 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
123339 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
120841 123340 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120842 123341 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3SegReaderStep(
120843 123342 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *p, /* Virtual table handle */
120844 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReaderCursor *pCsr /* Cursor object */
123343 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pCsr /* Cursor object */
120845 123344 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
120846 123345 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
120847 123346 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120848 123347 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isIgnoreEmpty = (pCsr->pFilter->flags & FTS3_SEGMENT_IGNORE_EMPTY);
120849 123348 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isRequirePos = (pCsr->pFilter->flags & FTS3_SEGMENT_REQUIRE_POS);
@@ -120852,10 +123351,13 @@
120852 123351 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isScan = (pCsr->pFilter->flags & FTS3_SEGMENT_SCAN);
120853 123352 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120854 123353 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3SegReader **apSegment = pCsr->apSegment;
120855 123354 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nSegment = pCsr->nSegment;
120856 123355 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3SegFilter *pFilter = pCsr->pFilter;
123356 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int (*xCmp)(Fts3SegReader *, Fts3SegReader *) = (
123357 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->bDescIdx ? fts3SegReaderDoclistCmpRev : fts3SegReaderDoclistCmp
123358 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
120857 123359 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120858 123360 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pCsr->nSegment==0 ) return SQLITE_OK;
120859 123361 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120860 123362 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
do {
120861 123363 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nMerge;
@@ -120863,11 +123365,11 @@
120863 123365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120864 123366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Advance the first pCsr->nAdvance entries in the apSegment[] array
120865 123367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** forward. Then sort the list in order of current term again.
120866 123368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
120867 123369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<pCsr->nAdvance; i++){
120868 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3SegReaderNext(p, apSegment[i]);
123370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegReaderNext(p, apSegment[i], 0);
120869 123371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) return rc;
120870 123372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120871 123373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fts3SegReaderSort(apSegment, nSegment, pCsr->nAdvance, fts3SegReaderCmp);
120872 123374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->nAdvance = 0;
120873 123375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -120902,69 +123404,87 @@
120902 123404 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
120903 123405 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nMerge++;
120904 123406 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120905 123407 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120906 123408 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( isIgnoreEmpty || (isRequirePos && !isColFilter) );
120907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( nMerge==1 && !isIgnoreEmpty ){
120908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr->aDoclist = apSegment[0]->aDoclist;
123409 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( nMerge==1
123410 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && !isIgnoreEmpty
123411 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ && (p->bDescIdx==0 || fts3SegReaderIsPending(apSegment[0])==0)
123412 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
120909 123413 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->nDoclist = apSegment[0]->nDoclist;
120910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_ROW;
123414 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( fts3SegReaderIsPending(apSegment[0]) ){
123415 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3MsrBufferData(pCsr, apSegment[0]->aDoclist, pCsr->nDoclist);
123416 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->aDoclist = pCsr->aBuffer;
123417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
123418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr->aDoclist = apSegment[0]->aDoclist;
123419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK ) rc = SQLITE_ROW;
120911 123421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
120912 123422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nDoclist = 0; /* Size of doclist */
120913 123423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iPrev = 0; /* Previous docid stored in doclist */
120914 123424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120915 123425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* The current term of the first nMerge entries in the array
120916 123426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** of Fts3SegReader objects is the same. The doclists must be merged
120917 123427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** and a single term returned with the merged doclist.
120918 123428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
120919 123429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<nMerge; i++){
120920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3SegReaderFirstDocid(apSegment[i]);
123430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3SegReaderFirstDocid(p, apSegment[i]);
120921 123431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3SegReaderSort(apSegment, nMerge, nMerge, fts3SegReaderDoclistCmp);
123432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3SegReaderSort(apSegment, nMerge, nMerge, xCmp);
120923 123433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( apSegment[0]->pOffsetList ){
120924 123434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int j; /* Number of segments that share a docid */
120925 123435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *pList;
120926 123436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nList;
120927 123437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nByte;
120928 123438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iDocid = apSegment[0]->iDocid;
120929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3SegReaderNextDocid(apSegment[0], &pList, &nList);
123439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3SegReaderNextDocid(p, apSegment[0], &pList, &nList);
120930 123440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
j = 1;
120931 123441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( j<nMerge
120932 123442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& apSegment[j]->pOffsetList
120933 123443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& apSegment[j]->iDocid==iDocid
120934 123444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
120935 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3SegReaderNextDocid(apSegment[j], 0, 0);
123445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3SegReaderNextDocid(p, apSegment[j], 0, 0);
120936 123446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
j++;
120937 123447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120938 123448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120939 123449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isColFilter ){
120940 123450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fts3ColumnFilter(pFilter->iCol, &pList, &nList);
120941 123451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120942 123452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120943 123453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !isIgnoreEmpty || nList>0 ){
120944 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nByte = sqlite3Fts3VarintLen(iDocid-iPrev) + (isRequirePos?nList+1:0);
123454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* Calculate the 'docid' delta value to write into the merged
123456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** doclist. */
123457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iDelta;
123458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->bDescIdx && nDoclist>0 ){
123459 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iDelta = iPrev - iDocid;
123460 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
123461 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iDelta = iDocid - iPrev;
123462 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123463 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iDelta>0 || (nDoclist==0 && iDelta==iDocid) );
123464 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( nDoclist>0 || iDelta==iDocid );
123465 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123466 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nByte = sqlite3Fts3VarintLen(iDelta) + (isRequirePos?nList+1:0);
120945 123467 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nDoclist+nByte>pCsr->nBuffer ){
120946 123468 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *aNew;
120947 123469 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->nBuffer = (nDoclist+nByte)*2;
120948 123470 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aNew = sqlite3_realloc(pCsr->aBuffer, pCsr->nBuffer);
120949 123471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !aNew ){
120950 123472 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_NOMEM;
120951 123473 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120952 123474 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->aBuffer = aNew;
120953 123475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120954 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nDoclist += sqlite3Fts3PutVarint(
120955 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- &pCsr->aBuffer[nDoclist], iDocid-iPrev
120956 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- );
123476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nDoclist += sqlite3Fts3PutVarint(&pCsr->aBuffer[nDoclist], iDelta);
120957 123477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
iPrev = iDocid;
120958 123478 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isRequirePos ){
120959 123479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memcpy(&pCsr->aBuffer[nDoclist], pList, nList);
120960 123480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nDoclist += nList;
120961 123481 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->aBuffer[nDoclist++] = '\0';
120962 123482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120963 123483 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120964 123484 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120965 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3SegReaderSort(apSegment, nMerge, j, fts3SegReaderDoclistCmp);
123485 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3SegReaderSort(apSegment, nMerge, j, xCmp);
120966 123486 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
120967 123487 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nDoclist>0 ){
120968 123488 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->aDoclist = pCsr->aBuffer;
120969 123489 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->nDoclist = nDoclist;
120970 123490 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_ROW;
@@ -120973,13 +123493,14 @@
120973 123493 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->nAdvance = nMerge;
120974 123494 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}while( rc==SQLITE_OK );
120975 123495 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120976 123496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
120977 123497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
123498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
120978 123499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
120979 123500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Fts3SegReaderFinish(
120980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReaderCursor *pCsr /* Cursor object */
123501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader *pCsr /* Cursor object */
120981 123502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
120982 123503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pCsr ){
120983 123504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
120984 123505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<pCsr->nSegment; i++){
120985 123506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3SegReaderFree(pCsr->apSegment[i]);
@@ -121002,47 +123523,60 @@
121002 123523 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If this function is called with iLevel<0, but there is only one
121003 123524 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** segment in the database, SQLITE_DONE is returned immediately.
121004 123525 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Otherwise, if successful, SQLITE_OK is returned. If an error occurs,
121005 123526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** an SQLite error code is returned.
121006 123527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
121007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3SegmentMerge(Fts3Table *p, int iLevel){
123528 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3SegmentMerge(Fts3Table *p, int iIndex, int iLevel){
121008 123529 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc; /* Return code */
121009 123530 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iIdx = 0; /* Index of new segment */
121010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iNewLevel = 0; /* Level to create new segment at */
123531 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iNewLevel = 0; /* Level/index to create new segment at */
121011 123532 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SegmentWriter *pWriter = 0; /* Used to write the new, merged, segment */
121012 123533 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3SegFilter filter; /* Segment term filter condition */
121013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3SegReaderCursor csr; /* Cursor to iterate through level(s) */
123534 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3MultiSegReader csr; /* Cursor to iterate through level(s) */
123535 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bIgnoreEmpty = 0; /* True to ignore empty segments */
121014 123536 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3SegReaderCursor(p, iLevel, 0, 0, 1, 0, &csr);
123537 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iLevel==FTS3_SEGCURSOR_ALL
123538 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || iLevel==FTS3_SEGCURSOR_PENDING
123539 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ || iLevel>=0
123540 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
123541 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iLevel<FTS3_SEGDIR_MAXLEVEL );
123542 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iIndex>=0 && iIndex<p->nIndex );
123543 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123544 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = sqlite3Fts3SegReaderCursor(p, iIndex, iLevel, 0, 0, 1, 0, &csr);
121016 123545 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK || csr.nSegment==0 ) goto finished;
121017 123546 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121018 123547 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( iLevel==FTS3_SEGCURSOR_ALL ){
121019 123548 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* This call is to merge all segments in the database to a single
121020 123549 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** segment. The level of the new segment is equal to the the numerically
121021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** greatest segment level currently present in the database. The index
121022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** of the new segment is always 0. */
121023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nDummy; /* TODO: Remove this */
123550 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** greatest segment level currently present in the database for this
123551 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** index. The idx of the new segment is always 0. */
121024 123552 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( csr.nSegment==1 ){
121025 123553 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_DONE;
121026 123554 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
goto finished;
121027 123555 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3SegmentCountMax(p, &nDummy, &iNewLevel);
123556 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegmentMaxLevel(p, iIndex, &iNewLevel);
123557 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bIgnoreEmpty = 1;
123558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123559 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else if( iLevel==FTS3_SEGCURSOR_PENDING ){
123560 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iNewLevel = iIndex * FTS3_SEGDIR_MAXLEVEL;
123561 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3AllocateSegdirIdx(p, iIndex, 0, &iIdx);
121029 123562 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
121030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* This call is to merge all segments at level iLevel. Find the next
123563 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ /* This call is to merge all segments at level iLevel. find the next
121031 123564 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** available segment index at level iLevel+1. The call to
121032 123565 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** fts3AllocateSegdirIdx() will merge the segments at level iLevel+1 to
121033 123566 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** a single iLevel+2 segment if necessary. */
121034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- iNewLevel = iLevel+1;
121035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3AllocateSegdirIdx(p, iNewLevel, &iIdx);
123567 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3AllocateSegdirIdx(p, iIndex, iLevel+1, &iIdx);
123568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ iNewLevel = iIndex * FTS3_SEGDIR_MAXLEVEL + iLevel+1;
121036 123569 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121037 123570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) goto finished;
121038 123571 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( csr.nSegment>0 );
121039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( iNewLevel>=0 );
123572 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iNewLevel>=(iIndex*FTS3_SEGDIR_MAXLEVEL) );
123573 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ assert( iNewLevel<((iIndex+1)*FTS3_SEGDIR_MAXLEVEL) );
121040 123574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121041 123575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(&filter, 0, sizeof(Fts3SegFilter));
121042 123576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
filter.flags = FTS3_SEGMENT_REQUIRE_POS;
121043 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- filter.flags |= (iLevel==FTS3_SEGCURSOR_ALL ? FTS3_SEGMENT_IGNORE_EMPTY : 0);
123577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ filter.flags |= (bIgnoreEmpty ? FTS3_SEGMENT_IGNORE_EMPTY : 0);
121044 123578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121045 123579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3Fts3SegReaderStart(p, &csr, &filter);
121046 123580 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( SQLITE_OK==rc ){
121047 123581 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3Fts3SegReaderStep(p, &csr);
121048 123582 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_ROW ) break;
@@ -121050,12 +123584,14 @@
121050 123584 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
csr.zTerm, csr.nTerm, csr.aDoclist, csr.nDoclist);
121051 123585 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121052 123586 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ) goto finished;
121053 123587 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pWriter );
121054 123588 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3DeleteSegdir(p, iLevel, csr.apSegment, csr.nSegment);
121056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) goto finished;
123589 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iLevel!=FTS3_SEGCURSOR_PENDING ){
123590 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3DeleteSegdir(p, iIndex, iLevel, csr.apSegment, csr.nSegment);
123591 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc!=SQLITE_OK ) goto finished;
123592 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121057 123593 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = fts3SegWriterFlush(p, pWriter, iNewLevel, iIdx);
121058 123594 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121059 123595 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
finished:
121060 123596 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fts3SegWriterFree(pWriter);
121061 123597 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3SegReaderFinish(&csr);
@@ -121062,14 +123598,21 @@
121062 123598 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
121063 123599 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121064 123600 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121065 123601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121066 123602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
121067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Flush the contents of pendingTerms to a level 0 segment.
123603 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ** Flush the contents of pendingTerms to level 0 segments.
121068 123604 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
121069 123605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3PendingTermsFlush(Fts3Table *p){
121070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return fts3SegmentMerge(p, FTS3_SEGCURSOR_PENDING);
123606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
123607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
123608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; rc==SQLITE_OK && i<p->nIndex; i++){
123609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegmentMerge(p, i, FTS3_SEGCURSOR_PENDING);
123610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_DONE ) rc = SQLITE_OK;
123611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123612 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Fts3PendingTermsClear(p);
123613 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return rc;
121071 123614 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121072 123615 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121073 123616 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
121074 123617 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Encode N integers as varints into a blob.
121075 123618 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
@@ -121215,10 +123758,27 @@
121215 123758 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_bind_blob(pStmt, 1, pBlob, nBlob, SQLITE_STATIC);
121216 123759 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_step(pStmt);
121217 123760 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*pRC = sqlite3_reset(pStmt);
121218 123761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(a);
121219 123762 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
123763 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123764 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ static int fts3DoOptimize(Fts3Table *p, int bReturnDone){
123765 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int i;
123766 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int bSeenDone = 0;
123767 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc = SQLITE_OK;
123768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; rc==SQLITE_OK && i<p->nIndex; i++){
123769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SegmentMerge(p, i, FTS3_SEGCURSOR_ALL);
123770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_DONE ){
123771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ bSeenDone = 1;
123772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_OK;
123773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Fts3SegmentsClose(p);
123776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3Fts3PendingTermsClear(p);
123777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (rc==SQLITE_OK && bReturnDone && bSeenDone) ? SQLITE_DONE : rc;
123779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121220 123780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121221 123781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
121222 123782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Handle a 'special' INSERT of the form:
121223 123783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
121224 123784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** "INSERT INTO tbl(tbl) VALUES(<expr>)"
@@ -121232,16 +123792,11 @@
121232 123792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nVal = sqlite3_value_bytes(pVal);
121233 123793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121234 123794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !zVal ){
121235 123795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_NOMEM;
121236 123796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( nVal==8 && 0==sqlite3_strnicmp(zVal, "optimize", 8) ){
121237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3SegmentMerge(p, FTS3_SEGCURSOR_ALL);
121238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_DONE ){
121239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = SQLITE_OK;
121240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
121241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3Fts3PendingTermsClear(p);
121242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
123797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3DoOptimize(p, 0);
121243 123798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_TEST
121244 123799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( nVal>9 && 0==sqlite3_strnicmp(zVal, "nodesize=", 9) ){
121245 123800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nNodeSize = atoi(&zVal[9]);
121246 123801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_OK;
121247 123802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else if( nVal>11 && 0==sqlite3_strnicmp(zVal, "maxpending=", 9) ){
@@ -121250,61 +123805,23 @@
121250 123805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
121251 123806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
121252 123807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = SQLITE_ERROR;
121253 123808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121254 123809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121255 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3Fts3SegmentsClose(p);
121256 123810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
121257 123811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121258 123812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121259 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
121260 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Return the deferred doclist associated with deferred token pDeferred.
121261 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** This function assumes that sqlite3Fts3CacheDeferredDoclists() has already
121262 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** been called to allocate and populate the doclist.
121263 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
121264 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- SQLITE_PRIVATE char *sqlite3Fts3DeferredDoclist(Fts3DeferredToken *pDeferred, int *pnByte){
121265 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pDeferred->pList ){
121266 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnByte = pDeferred->pList->nData;
121267 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return pDeferred->pList->aData;
121268 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
121269 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pnByte = 0;
121270 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return 0;
121271 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
121272 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
121273 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
121274 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Helper fucntion for FreeDeferredDoclists(). This function removes all
121275 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** references to deferred doclists from within the tree of Fts3Expr
121276 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** structures headed by
121277 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
121278 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void fts3DeferredDoclistClear(Fts3Expr *pExpr){
121279 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr ){
121280 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3DeferredDoclistClear(pExpr->pLeft);
121281 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3DeferredDoclistClear(pExpr->pRight);
121282 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->isLoaded ){
121283 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(pExpr->aDoclist);
121284 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pExpr->isLoaded = 0;
121285 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pExpr->aDoclist = 0;
121286 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pExpr->nDoclist = 0;
121287 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pExpr->pCurrent = 0;
121288 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pExpr->iCurrent = 0;
121289 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
121290 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
121291 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
121292 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
121293 123813 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
121294 123814 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Delete all cached deferred doclists. Deferred doclists are cached
121295 123815 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** (allocated) by the sqlite3Fts3CacheDeferredDoclists() function.
121296 123816 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
121297 123817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Fts3FreeDeferredDoclists(Fts3Cursor *pCsr){
121298 123818 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3DeferredToken *pDef;
121299 123819 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(pDef=pCsr->pDeferred; pDef; pDef=pDef->pNext){
121300 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(pDef->pList);
123820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PendingListDelete(pDef->pList);
121301 123821 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pDef->pList = 0;
121302 123822 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121303 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr->pDeferred ){
121304 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3DeferredDoclistClear(pCsr->pExpr);
121305 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
121306 123823 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121307 123824 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121308 123825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
121309 123826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Free all entries in the pCsr->pDeffered list. Entries are added to
121310 123827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** this list using sqlite3Fts3DeferToken().
@@ -121312,11 +123829,11 @@
121312 123829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE void sqlite3Fts3FreeDeferredTokens(Fts3Cursor *pCsr){
121313 123830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3DeferredToken *pDef;
121314 123831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3DeferredToken *pNext;
121315 123832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(pDef=pCsr->pDeferred; pDef; pDef=pNext){
121316 123833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pNext = pDef->pNext;
121317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(pDef->pList);
123834 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3PendingListDelete(pDef->pList);
121318 123835 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(pDef);
121319 123836 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121320 123837 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pCsr->pDeferred = 0;
121321 123838 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121322 123839 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -121376,10 +123893,37 @@
121376 123893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121377 123894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121378 123895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121379 123896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
121380 123897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
123898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123899 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ SQLITE_PRIVATE int sqlite3Fts3DeferredTokenList(
123900 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3DeferredToken *p,
123901 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char **ppData,
123902 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int *pnData
123903 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ){
123904 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pRet;
123905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int nSkip;
123906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 dummy;
123907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *ppData = 0;
123909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnData = 0;
123910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( p->pList==0 ){
123912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
123913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
123914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRet = (char *)sqlite3_malloc(p->pList->nData);
123916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( !pRet ) return SQLITE_NOMEM;
123917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nSkip = sqlite3Fts3GetVarint(p->pList->aData, &dummy);
123919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *pnData = p->pList->nData - nSkip;
123920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ *ppData = pRet;
123921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
123922 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ memcpy(pRet, &p->pList->aData[nSkip], *pnData);
123923 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return SQLITE_OK;
123924 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121381 123925 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121382 123926 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
121383 123927 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** Add an entry for token pToken to the pCsr->pDeferred list.
121384 123928 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
121385 123929 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3DeferToken(
@@ -121451,11 +123995,11 @@
121451 123995 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
121452 123996 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Table *p = (Fts3Table *)pVtab;
121453 123997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK; /* Return Code */
121454 123998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isRemove = 0; /* True for an UPDATE or DELETE */
121455 123999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iRemove = 0; /* Rowid removed by UPDATE or DELETE */
121456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u32 *aSzIns; /* Sizes of inserted documents */
124000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ u32 *aSzIns = 0; /* Sizes of inserted documents */
121457 124001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
u32 *aSzDel; /* Sizes of deleted documents */
121458 124002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nChng = 0; /* Net change in number of documents */
121459 124003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int bInsertDone = 0;
121460 124004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121461 124005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( p->pSegments==0 );
@@ -121466,16 +124010,20 @@
121466 124010 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
121467 124011 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( nArg>1
121468 124012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& sqlite3_value_type(apVal[0])==SQLITE_NULL
121469 124013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
&& sqlite3_value_type(apVal[p->nColumn+2])!=SQLITE_NULL
121470 124014 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
121471 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return fts3SpecialInsert(p, apVal[p->nColumn+2]);
124015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3SpecialInsert(p, apVal[p->nColumn+2]);
124016 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto update_out;
121472 124017 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121473 124018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121474 124019 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Allocate space to hold the change in document sizes */
121475 124020 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aSzIns = sqlite3_malloc( sizeof(aSzIns[0])*(p->nColumn+1)*2 );
121476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aSzIns==0 ) return SQLITE_NOMEM;
124021 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( aSzIns==0 ){
124022 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = SQLITE_NOMEM;
124023 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto update_out;
124024 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
121477 124025 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aSzDel = &aSzIns[p->nColumn+1];
121478 124026 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(aSzIns, 0, sizeof(aSzIns[0])*(p->nColumn+1)*2);
121479 124027 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121480 124028 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If this is an INSERT operation, or an UPDATE that modifies the rowid
121481 124029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** value, then this operation requires constraint handling.
@@ -121521,12 +124069,11 @@
121521 124069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
bInsertDone = 1;
121522 124070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121523 124071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121524 124072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121525 124073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc!=SQLITE_OK ){
121526 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(aSzIns);
121527 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
124074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ goto update_out;
121528 124075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121529 124076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121530 124077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* If this is a DELETE or UPDATE operation, remove the old record. */
121531 124078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( sqlite3_value_type(apVal[0])!=SQLITE_NULL ){
121532 124079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( sqlite3_value_type(apVal[0])==SQLITE_INTEGER );
@@ -121555,10 +124102,11 @@
121555 124102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121556 124103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( p->bHasStat ){
121557 124104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fts3UpdateDocTotals(&rc, p, aSzIns, aSzDel, nChng);
121558 124105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121559 124106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
124107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ update_out:
121560 124108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_free(aSzIns);
121561 124109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3Fts3SegmentsClose(p);
121562 124110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
121563 124111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121564 124112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -121569,16 +124117,14 @@
121569 124117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
121570 124118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SQLITE_PRIVATE int sqlite3Fts3Optimize(Fts3Table *p){
121571 124119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc;
121572 124120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = sqlite3_exec(p->db, "SAVEPOINT fts3", 0, 0, 0);
121573 124121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
121574 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3SegmentMerge(p, FTS3_SEGCURSOR_ALL);
121575 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
121576 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3_exec(p->db, "RELEASE fts3", 0, 0, 0);
121577 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
121578 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3Fts3PendingTermsClear(p);
121579 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
124122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = fts3DoOptimize(p, 1);
124123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc==SQLITE_OK || rc==SQLITE_DONE ){
124124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int rc2 = sqlite3_exec(p->db, "RELEASE fts3", 0, 0, 0);
124125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( rc2!=SQLITE_OK ) rc = rc2;
121580 124126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
121581 124127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_exec(p->db, "ROLLBACK TO fts3", 0, 0, 0);
121582 124128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_exec(p->db, "RELEASE fts3", 0, 0, 0);
121583 124129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121584 124130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -121763,76 +124309,24 @@
121763 124309 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
121764 124310 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iPhrase = 0; /* Variable used as the phrase counter */
121765 124311 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return fts3ExprIterate2(pExpr, &iPhrase, x, pCtx);
121766 124312 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121767 124313 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121768 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /*
121769 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** The argument to this function is always a phrase node. Its doclist
121770 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** (Fts3Expr.aDoclist[]) and the doclists associated with all phrase nodes
121771 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** to the left of this one in the query tree have already been loaded.
121772 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
121773 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If this phrase node is part of a series of phrase nodes joined by
121774 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** NEAR operators (and is not the left-most of said series), then elements are
121775 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** removed from the phrases doclist consistent with the NEAR restriction. If
121776 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** required, elements may be removed from the doclists of phrases to the
121777 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** left of this one that are part of the same series of NEAR operator
121778 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** connected phrases.
121779 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
121780 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** If an OOM error occurs, SQLITE_NOMEM is returned. Otherwise, SQLITE_OK.
121781 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
121782 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static int fts3ExprNearTrim(Fts3Expr *pExpr){
121783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = SQLITE_OK;
121784 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Expr *pParent = pExpr->pParent;
121785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
121786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pExpr->eType==FTSQUERY_PHRASE );
121787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( rc==SQLITE_OK
121788 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && pParent
121789 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && pParent->eType==FTSQUERY_NEAR
121790 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- && pParent->pRight==pExpr
121791 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ){
121792 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* This expression (pExpr) is the right-hand-side of a NEAR operator.
121793 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** Find the expression to the left of the same operator.
121794 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
121795 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nNear = pParent->nNear;
121796 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Expr *pLeft = pParent->pLeft;
121797 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
121798 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pLeft->eType!=FTSQUERY_PHRASE ){
121799 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLeft->eType==FTSQUERY_NEAR );
121800 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pLeft->pRight->eType==FTSQUERY_PHRASE );
121801 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pLeft = pLeft->pRight;
121802 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
121803 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
121804 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3ExprNearTrim(pLeft, pExpr, nNear);
121805 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
121806 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pExpr = pLeft;
121807 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pParent = pExpr->pParent;
121808 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
121809 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
121810 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return rc;
121811 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
121812 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
121813 124314 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
121814 124315 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This is an fts3ExprIterate() callback used while loading the doclists
121815 124316 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** for each phrase into Fts3Expr.aDoclist[]/nDoclist. See also
121816 124317 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** fts3ExprLoadDoclists().
121817 124318 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
121818 124319 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int fts3ExprLoadDoclistsCb(Fts3Expr *pExpr, int iPhrase, void *ctx){
121819 124320 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = SQLITE_OK;
124321 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ Fts3Phrase *pPhrase = pExpr->pPhrase;
121820 124322 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LoadDoclistCtx *p = (LoadDoclistCtx *)ctx;
121821 124323 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121822 124324 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(iPhrase);
121823 124325 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121824 124326 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
p->nPhrase++;
121825 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- p->nToken += pExpr->pPhrase->nToken;
121826 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
121827 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->isLoaded==0 ){
121828 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = sqlite3Fts3ExprLoadDoclist(p->pCsr, pExpr);
121829 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pExpr->isLoaded = 1;
121830 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc==SQLITE_OK ){
121831 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = fts3ExprNearTrim(pExpr);
121832 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
121833 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
124327 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->nToken += pPhrase->nToken;
121834 124328 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121835 124329 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
121836 124330 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
121837 124331 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
121838 124332 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -122002,11 +124496,11 @@
122002 124496 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SnippetPhrase *pPhrase = &p->aPhrase[iPhrase];
122003 124497 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *pCsr;
122004 124498 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122005 124499 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPhrase->nToken = pExpr->pPhrase->nToken;
122006 124500 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr = sqlite3Fts3FindPositions(p->pCsr, pExpr, p->pCsr->iPrevId, p->iCol);
124501 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr = sqlite3Fts3EvalPhrasePoslist(p->pCsr, pExpr, p->iCol);
122008 124502 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pCsr ){
122009 124503 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iFirst = 0;
122010 124504 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPhrase->pList = pCsr;
122011 124505 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fts3GetDeltaPosition(&pCsr, &iFirst);
122012 124506 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pPhrase->pHead = pCsr;
@@ -122359,30 +124853,10 @@
122359 124853 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122360 124854 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*ppCollist = pEnd;
122361 124855 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return nEntry;
122362 124856 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
122363 124857 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122364 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- static void fts3LoadColumnlistCounts(char **pp, u32 *aOut, int isGlobal){
122365 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pCsr = *pp;
122366 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( *pCsr ){
122367 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nHit;
122368 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 iCol = 0;
122369 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( *pCsr==0x01 ){
122370 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr++;
122371 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr += sqlite3Fts3GetVarint(pCsr, &iCol);
122372 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
122373 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- nHit = fts3ColumnlistCount(&pCsr);
122374 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( nHit>0 );
122375 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( isGlobal ){
122376 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aOut[iCol*3+1]++;
122377 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
122378 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aOut[iCol*3] += nHit;
122379 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
122380 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr++;
122381 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- *pp = pCsr;
122382 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
122383 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
122384 124858 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
122385 124859 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** fts3ExprIterate() callback used to collect the "global" matchinfo stats
122386 124860 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** for a single query.
122387 124861 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
122388 124862 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** fts3ExprIterate() callback to load the 'global' elements of a
@@ -122412,52 +124886,13 @@
122412 124886 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Expr *pExpr, /* Phrase expression node */
122413 124887 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iPhrase, /* Phrase number (numbered from zero) */
122414 124888 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
void *pCtx /* Pointer to MatchInfo structure */
122415 124889 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
122416 124890 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
MatchInfo *p = (MatchInfo *)pCtx;
122417 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Cursor *pCsr = p->pCursor;
122418 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pIter;
122419 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pEnd;
122420 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pFree = 0;
122421 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- u32 *aOut = &p->aMatchinfo[3*iPhrase*p->nCol];
122422 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
122423 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pExpr->isLoaded );
122424 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( pExpr->eType==FTSQUERY_PHRASE );
122425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
122426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pCsr->pDeferred ){
122427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- Fts3Phrase *pPhrase = pExpr->pPhrase;
122428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int ii;
122429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(ii=0; ii<pPhrase->nToken; ii++){
122430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pPhrase->aToken[ii].bFulltext ) break;
122431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
122432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( ii<pPhrase->nToken ){
122433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int nFree = 0;
122434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int rc = sqlite3Fts3ExprLoadFtDoclist(pCsr, pExpr, &pFree, &nFree);
122435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( rc!=SQLITE_OK ) return rc;
122436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIter = pFree;
122437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pEnd = &pFree[nFree];
122438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
122439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iCol; /* Column index */
122440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(iCol=0; iCol<p->nCol; iCol++){
122441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aOut[iCol*3 + 1] = (u32)p->nDoc;
122442 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aOut[iCol*3 + 2] = (u32)p->nDoc;
122443 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
122444 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
122445 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
122446 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
122447 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIter = pExpr->aDoclist;
122448 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pEnd = &pExpr->aDoclist[pExpr->nDoclist];
122449 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
122450 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
122451 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Fill in the global hit count matrix row for this phrase. */
122452 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( pIter<pEnd ){
122453 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- while( *pIter++ & 0x80 ); /* Skip past docid. */
122454 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3LoadColumnlistCounts(&pIter, &aOut[1], 1);
122455 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
122456 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
122457 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_free(pFree);
122458 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return SQLITE_OK;
124891 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return sqlite3Fts3EvalPhraseStats(
124892 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->pCursor, pExpr, &p->aMatchinfo[3*iPhrase*p->nCol]
124893 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ );
122459 124894 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
122460 124895 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122461 124896 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
122462 124897 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** fts3ExprIterate() callback used to collect the "local" part of the
122463 124898 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** FTS3_MATCHINFO_HITS array. The local stats are those elements of the
@@ -122470,18 +124905,17 @@
122470 124905 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
122471 124906 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
MatchInfo *p = (MatchInfo *)pCtx;
122472 124907 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iStart = iPhrase * p->nCol * 3;
122473 124908 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int i;
122474 124909 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122475 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- for(i=0; i<p->nCol; i++) p->aMatchinfo[iStart+i*3] = 0;
122476 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
122477 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pExpr->aDoclist ){
124910 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ for(i=0; i<p->nCol; i++){
122478 124911 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *pCsr;
122479 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
122480 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pCsr = sqlite3Fts3FindPositions(p->pCursor, pExpr, p->pCursor->iPrevId, -1);
124912 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pCsr = sqlite3Fts3EvalPhrasePoslist(p->pCursor, pExpr, i);
122481 124913 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pCsr ){
122482 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3LoadColumnlistCounts(&pCsr, &p->aMatchinfo[iStart], 0);
124914 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->aMatchinfo[iStart+i*3] = fts3ColumnlistCount(&pCsr);
124915 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }else{
124916 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ p->aMatchinfo[iStart+i*3] = 0;
122483 124917 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
122484 124918 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
122485 124919 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122486 124920 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return SQLITE_OK;
122487 124921 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -122563,13 +124997,12 @@
122563 124997 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** values for a matchinfo() FTS3_MATCHINFO_LCS request.
122564 124998 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
122565 124999 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typedef struct LcsIterator LcsIterator;
122566 125000 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
struct LcsIterator {
122567 125001 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
Fts3Expr *pExpr; /* Pointer to phrase expression */
122568 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- char *pRead; /* Cursor used to iterate through aDoclist */
122569 125002 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iPosOffset; /* Tokens count up to end of this phrase */
122570 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iCol; /* Current column number */
125003 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ char *pRead; /* Cursor used to iterate through aDoclist */
122571 125004 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iPos; /* Current position */
122572 125005 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
};
122573 125006 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122574 125007 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
122575 125008 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** If LcsIterator.iCol is set to the following value, the iterator has
@@ -122596,21 +125029,14 @@
122596 125029 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *pRead = pIter->pRead;
122597 125030 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
sqlite3_int64 iRead;
122598 125031 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc = 0;
122599 125032 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122600 125033 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pRead += sqlite3Fts3GetVarint(pRead, &iRead);
122601 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iRead==0 ){
122602 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIter->iCol = LCS_ITERATOR_FINISHED;
125034 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( iRead==0 || iRead==1 ){
125035 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pRead = 0;
122603 125036 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = 1;
122604 125037 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
122605 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iRead==1 ){
122606 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pRead += sqlite3Fts3GetVarint(pRead, &iRead);
122607 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIter->iCol = (int)iRead;
122608 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIter->iPos = pIter->iPosOffset;
122609 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pRead += sqlite3Fts3GetVarint(pRead, &iRead);
122610 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = 1;
122611 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
122612 125038 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIter->iPos += (int)(iRead-2);
122613 125039 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
122614 125040 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122615 125041 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIter->pRead = pRead;
122616 125042 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return rc;
@@ -122638,46 +125064,38 @@
122638 125064 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**/
122639 125065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aIter = sqlite3_malloc(sizeof(LcsIterator) * pCsr->nPhrase);
122640 125066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !aIter ) return SQLITE_NOMEM;
122641 125067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
memset(aIter, 0, sizeof(LcsIterator) * pCsr->nPhrase);
122642 125068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
(void)fts3ExprIterate(pCsr->pExpr, fts3MatchinfoLcsCb, (void*)aIter);
125069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
122643 125070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<pInfo->nPhrase; i++){
122644 125071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LcsIterator *pIter = &aIter[i];
122645 125072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nToken -= pIter->pExpr->pPhrase->nToken;
122646 125073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pIter->iPosOffset = nToken;
122647 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIter->pRead = sqlite3Fts3FindPositions(pCsr,pIter->pExpr,pCsr->iPrevId,-1);
122648 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( pIter->pRead ){
122649 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIter->iPos = pIter->iPosOffset;
122650 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- fts3LcsIteratorAdvance(&aIter[i]);
122651 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }else{
122652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pIter->iCol = LCS_ITERATOR_FINISHED;
122653 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- }
122654 125074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
122655 125075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122656 125076 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(iCol=0; iCol<pInfo->nCol; iCol++){
122657 125077 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nLcs = 0; /* LCS value for this column */
122658 125078 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nLive = 0; /* Number of iterators in aIter not at EOF */
122659 125079 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* Loop through the iterators in aIter[]. Set nLive to the number of
122661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** iterators that point to a position-list corresponding to column iCol.
122662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
122663 125080 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<pInfo->nPhrase; i++){
122664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- assert( aIter[i].iCol>=iCol );
122665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( aIter[i].iCol==iCol ) nLive++;
125081 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ LcsIterator *pIt = &aIter[i];
125082 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIt->pRead = sqlite3Fts3EvalPhrasePoslist(pCsr, pIt->pExpr, iCol);
125083 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pIt->pRead ){
125084 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pIt->iPos = pIt->iPosOffset;
125085 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ fts3LcsIteratorAdvance(&aIter[i]);
125086 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ nLive++;
125087 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
122666 125088 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
122667 125089 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122668 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- /* The following loop runs until all iterators in aIter[] have finished
122669 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** iterating through positions in column iCol. Exactly one of the
122670 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** iterators is advanced each time the body of the loop is run.
122671 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- */
122672 125090 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
while( nLive>0 ){
122673 125091 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LcsIterator *pAdv = 0; /* The iterator to advance by one position */
122674 125092 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nThisLcs = 0; /* LCS for the current iterator positions */
122675 125093 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122676 125094 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(i=0; i<pInfo->nPhrase; i++){
122677 125095 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
LcsIterator *pIter = &aIter[i];
122678 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- if( iCol!=pIter->iCol ){
125096 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if( pIter->pRead==0 ){
122679 125097 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* This iterator is already at EOF for this column. */
122680 125098 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nThisLcs = 0;
122681 125099 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
122682 125100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pAdv==0 || pIter->iPos<pAdv->iPos ){
122683 125101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pAdv = pIter;
@@ -122739,11 +125157,11 @@
122739 125157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( bGlobal ) pInfo->aMatchinfo[0] = pInfo->nCol;
122740 125158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
122741 125159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
122742 125160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
case FTS3_MATCHINFO_NDOC:
122743 125161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( bGlobal ){
122744 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 nDoc;
125162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 nDoc = 0;
122745 125163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = fts3MatchinfoSelectDoctotal(pTab, &pSelect, &nDoc, 0);
122746 125164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pInfo->aMatchinfo[0] = (u32)nDoc;
122747 125165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
122748 125166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
122749 125167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -123013,11 +125431,11 @@
123013 125431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iTerm; /* For looping through nTerm phrase terms */
123014 125432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *pList; /* Pointer to position list for phrase */
123015 125433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iPos = 0; /* First position in position-list */
123016 125434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
123017 125435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
UNUSED_PARAMETER(iPhrase);
123018 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- pList = sqlite3Fts3FindPositions(p->pCsr, pExpr, p->iDocid, p->iCol);
125436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ pList = sqlite3Fts3EvalPhrasePoslist(p->pCsr, pExpr, p->iCol);
123019 125437 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nTerm = pExpr->pPhrase->nToken;
123020 125438 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( pList ){
123021 125439 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
fts3GetDeltaPosition(&pList, &iPos);
123022 125440 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( iPos>=0 );
123023 125441 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -124634,11 +127052,11 @@
124634 127052 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
124635 127053 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static float cellArea(Rtree *pRtree, RtreeCell *p){
124636 127054 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
float area = 1.0;
124637 127055 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int ii;
124638 127056 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(ii=0; ii<(pRtree->nDim*2); ii+=2){
124639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- area = area * (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii]));
127057 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ area = (float)(area * (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii])));
124640 127058 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
124641 127059 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return area;
124642 127060 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
124643 127061 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
124644 127062 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -124647,11 +127065,11 @@
124647 127065 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
124648 127066 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static float cellMargin(Rtree *pRtree, RtreeCell *p){
124649 127067 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
float margin = 0.0;
124650 127068 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int ii;
124651 127069 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(ii=0; ii<(pRtree->nDim*2); ii+=2){
124652 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- margin += (DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii]));
127070 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ margin += (float)(DCOORD(p->aCoord[ii+1]) - DCOORD(p->aCoord[ii]));
124653 127071 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
124654 127072 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return margin;
124655 127073 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
124656 127074 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
124657 127075 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -124732,11 +127150,11 @@
124732 127150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
124733 127151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( x2<x1 ){
124734 127152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
o = 0.0;
124735 127153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
break;
124736 127154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
124737 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- o = o * (x2-x1);
127155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ o = o * (float)(x2-x1);
124738 127156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
124739 127157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
124740 127158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
overlap += o;
124741 127159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
124742 127160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -124751,16 +127169,16 @@
124751 127169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
RtreeCell *pInsert,
124752 127170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
RtreeCell *aCell,
124753 127171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nCell,
124754 127172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iExclude
124755 127173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
124756 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- float before;
124757 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- float after;
127174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double before;
127175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ double after;
124758 127176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
before = cellOverlap(pRtree, p, aCell, nCell, iExclude);
124759 127177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
cellUnion(pRtree, p, pInsert);
124760 127178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
after = cellOverlap(pRtree, p, aCell, nCell, iExclude);
124761 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- return after-before;
127179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return (float)(after-before);
124762 127180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
124763 127181 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#endif
124764 127182 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
124765 127183 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
124766 127184 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/*
@@ -124778,15 +127196,15 @@
124778 127196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
RtreeNode *pNode;
124779 127197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = nodeAcquire(pRtree, 1, 0, &pNode);
124780 127198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
124781 127199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(ii=0; rc==SQLITE_OK && ii<(pRtree->iDepth-iHeight); ii++){
124782 127200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iCell;
124783 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- sqlite3_int64 iBest;
127201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ sqlite3_int64 iBest = 0;
124784 127202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
124785 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- float fMinGrowth;
124786 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- float fMinArea;
124787 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- float fMinOverlap;
127203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ float fMinGrowth = 0.0;
127204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ float fMinArea = 0.0;
127205 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ float fMinOverlap = 0.0;
124788 127206 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
124789 127207 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nCell = NCELL(pNode);
124790 127208 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
RtreeCell cell;
124791 127209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
RtreeNode *pChild;
124792 127210 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -125212,13 +127630,13 @@
125212 127630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
125213 127631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int **aaSorted;
125214 127632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int *aSpare;
125215 127633 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int ii;
125216 127634 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
125217 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iBestDim;
125218 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iBestSplit;
125219 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- float fBestMargin;
127635 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iBestDim = 0;
127636 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iBestSplit = 0;
127637 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ float fBestMargin = 0.0;
125220 127638 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
125221 127639 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nByte = (pRtree->nDim+1)*(sizeof(int*)+nCell*sizeof(int));
125222 127640 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
125223 127641 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aaSorted = (int **)sqlite3_malloc(nByte);
125224 127642 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( !aaSorted ){
@@ -125236,13 +127654,13 @@
125236 127654 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SortByDimension(pRtree, aaSorted[ii], nCell, ii, aCell, aSpare);
125237 127655 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
125238 127656 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
125239 127657 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(ii=0; ii<pRtree->nDim; ii++){
125240 127658 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
float margin = 0.0;
125241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- float fBestOverlap;
125242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- float fBestArea;
125243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iBestLeft;
127659 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ float fBestOverlap = 0.0;
127660 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ float fBestArea = 0.0;
127661 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iBestLeft = 0;
125244 127662 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int nLeft;
125245 127663 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
125246 127664 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(
125247 127665 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nLeft=RTREE_MINCELLS(pRtree);
125248 127666 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nLeft<=(nCell-RTREE_MINCELLS(pRtree));
@@ -125553,11 +127971,11 @@
125553 127971 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int deleteCell(Rtree *, RtreeNode *, int, int);
125554 127972 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
125555 127973 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
static int removeNode(Rtree *pRtree, RtreeNode *pNode, int iHeight){
125556 127974 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc;
125557 127975 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc2;
125558 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- RtreeNode *pParent;
127976 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ RtreeNode *pParent = 0;
125559 127977 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int iCell;
125560 127978 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
125561 127979 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
assert( pNode->nRef==1 );
125562 127980 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
125563 127981 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Remove the entry in the parent cell. */
@@ -125701,23 +128119,23 @@
125701 128119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}else{
125702 128120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nodeGetCell(pRtree, pNode, ii, &aCell[ii]);
125703 128121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
125704 128122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aOrder[ii] = ii;
125705 128123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(iDim=0; iDim<pRtree->nDim; iDim++){
125706 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2]);
125707 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aCenterCoord[iDim] += DCOORD(aCell[ii].aCoord[iDim*2+1]);
128124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aCenterCoord[iDim] += (float)DCOORD(aCell[ii].aCoord[iDim*2]);
128125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aCenterCoord[iDim] += (float)DCOORD(aCell[ii].aCoord[iDim*2+1]);
125708 128126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
125709 128127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
125710 128128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(iDim=0; iDim<pRtree->nDim; iDim++){
125711 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- aCenterCoord[iDim] = aCenterCoord[iDim]/((float)nCell*2.0);
128129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ aCenterCoord[iDim] = (float)(aCenterCoord[iDim]/((float)nCell*2.0));
125712 128130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
125713 128131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
125714 128132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(ii=0; ii<nCell; ii++){
125715 128133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aDistance[ii] = 0.0;
125716 128134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
for(iDim=0; iDim<pRtree->nDim; iDim++){
125717 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- float coord = DCOORD(aCell[ii].aCoord[iDim*2+1]) -
125718 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- DCOORD(aCell[ii].aCoord[iDim*2]);
128135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ float coord = (float)(DCOORD(aCell[ii].aCoord[iDim*2+1]) -
128136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ DCOORD(aCell[ii].aCoord[iDim*2]));
125719 128137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
aDistance[ii] += (coord-aCenterCoord[iDim])*(coord-aCenterCoord[iDim]);
125720 128138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
125721 128139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
125722 128140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
125723 128141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
SortByDistance(aOrder, nCell, aDistance, aSpare);
@@ -125812,14 +128230,14 @@
125812 128230 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
nodeGetCell(pRtree, pNode, ii, &cell);
125813 128231 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
125814 128232 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
/* Find a node to store this cell in. pNode->iNode currently contains
125815 128233 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** the height of the sub-tree headed by the cell.
125816 128234 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
125817 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = ChooseLeaf(pRtree, &cell, pNode->iNode, &pInsert);
128235 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = ChooseLeaf(pRtree, &cell, (int)pNode->iNode, &pInsert);
125818 128236 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
125819 128237 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc2;
125820 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- rc = rtreeInsertCell(pRtree, pInsert, &cell, pNode->iNode);
128238 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ rc = rtreeInsertCell(pRtree, pInsert, &cell, (int)pNode->iNode);
125821 128239 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc2 = nodeRelease(pRtree, pInsert);
125822 128240 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
125823 128241 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = rc2;
125824 128242 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
125825 128243 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
@@ -126204,11 +128622,11 @@
126204 128622 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int isCreate /* True for xCreate, false for xConnect */
126205 128623 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
){
126206 128624 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
int rc;
126207 128625 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
char *zSql;
126208 128626 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( isCreate ){
126209 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- int iPageSize;
128627 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ int iPageSize = 0;
126210 128628 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
zSql = sqlite3_mprintf("PRAGMA %Q.page_size", pRtree->zDb);
126211 128629 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
rc = getIntFromStmt(db, zSql, &iPageSize);
126212 128630 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( rc==SQLITE_OK ){
126213 128631 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
pRtree->iNodeSize = iPageSize-64;
126214 128632 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
if( (4+pRtree->nBytesPerCell*RTREE_MAXCELLS)<pRtree->iNodeSize ){
@@ -127007,14 +129425,11 @@
127007 129425 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** May you find forgiveness for yourself and forgive others.
127008 129426 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** May you share freely, never taking more than you give.
127009 129427 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
**
127010 129428 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*************************************************************************
127011 129429 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
** This file implements a tokenizer for fts3 based on the ICU library.
127012 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- **
127013 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- ** $Id: fts3_icu.c,v 1.3 2008/09/01 18:34:20 danielk1977 Exp $
127014 129430 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
*/
127015 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
-
127016 129431 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#if !defined(SQLITE_CORE) || defined(SQLITE_ENABLE_FTS3)
127017 129432 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#ifdef SQLITE_ENABLE_ICU
127018 129433 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
127019 129434 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
127020 129435 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
#include <unicode/ubrk.h>
127021 129436 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!